Wie mache ich Group By Rollup in R? (Wie SQL)

Ich habe einen Datensatz und möchte so etwas wie @ ausführeGroup By Rollup wie wir in SQL für aggregierte Werte haben.

Below ist ein reproduzierbares Beispiel. Ich kenneAggrega funktioniert wirklich gut wie erklärtHie aber keine zufriedenstellende Passform für meinen Fall.

year<- c('2016','2016','2016','2016','2017','2017','2017','2017')
month<- c('1','1','1','1','2','2','2','2')
region<- c('east','west','east','west','east','west','east','west')
sales<- c(100,200,300,400,200,400,600,800)
df<- data.frame(year,month,region,sales)
df


year month region sales
1 2016     1   east   100
2 2016     1   west   200
3 2016     1   east   300
4 2016     1   west   400
5 2017     2   east   200
6 2017     2   west   400
7 2017     2   east   600
8 2017     2   west   800

Jetzt möchte ich die Aggregation (Summe nach Jahr-Monat-Region) durchführen und die neue aggregierte Zeile in den vorhandenen Datenrahmen einfügen, z. Es sollten zwei zusätzliche Zeilen wie unten mit einem neuen Namen für region als 'USA' für die zusammengefassten Zeilen vorhanden sein.

year month region sales
1 2016     1   east   400
2 2016     1   west   600
3 2016     1    USA  1000
4 2017     2   east   800
5 2017     2   west  1200
6 2017     2    USA  2000

Ich habe einen Weg gefunden (siehe unten), aber ich bin mir sehr sicher, dass es eine optimale Lösung für diesen oder einen besseren Workaround als meinen gibt.

df1<- setNames(aggregate(df$sales, by=list(df$year,df$month, df$region), FUN=sum),
    c('year','month','region', 'sales'))


df2<- setNames(aggregate(df$sales, by=list(df$year,df$month), FUN=sum),
               c('year','month', 'sales'))

df2$region<- 'USA'                  ## added a new column- region- for total USA
df2<- df2[,  c('year','month','region', 'sales')]  ## reordering the columns of df2

df3<- rbind(df1,df2)

df3<- df3[order(df3$year,df3$month,df3$region),]  ## order by
rownames(df3)<- NULL  ## renumbered the rows after order by

df3

Danke für die Unterstützung

Antworten auf die Frage(6)

Ihre Antwort auf die Frage