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