假设我的数据框df
包含三列:revenue
(int),quarter
(4级因子)和product
(3级因子) )。
df <- data.frame(
revenue = sample(500:5000, 10, replace=TRUE),
quarter = sample(c("q1", "q2", "q3", "q4"), 50, replace = TRUE),
product = sample(c("book", "movie", "tv"), 50, replace = TRUE))
使用tapply
按季度或产品分组并在收入上执行各种功能非常容易,例如:
quarterly_revenue <- tapply(df$revenue, df$quarter, sum)
这给了我每季度的收入总和。
然而,这是我的问题:如果我想要更细化,即:每个产品每季度的收入总和怎么办?我已经尝试了split
函数来创建数据框列表并使用各种plyr
解决方案,但没有一个能给我输出我正在寻找的输出。我知道我可以基于每个因素进行子集,但这似乎效率低下,特别是当我正在使用的实际集合具有更多因子级别时。
任何想法?谢谢你的帮助!
答案 0 :(得分:0)
我们将分组列放在list
中,然后获取sum
tapply(df$revenue, list(df$quarter, df$product), sum)
使用aggregate
aggregate(revenue~., df, sum)
或dplyr
或data.table
library(dplyr)
df %>%
group_by(quarter, product) %>%
summarise(Sum = sum(revenue))
答案 1 :(得分:0)
您可以将data.table
与by
参数一起使用:
library( data.table )
setDT( df )[ , quarterly_revenue := sum( revenue ),
by = .( quarter, product ) ]
或者,总结(而不仅仅是添加一列):
library( data.table )
library( magrittr )
setDT( df )[ , sum( revenue ),
by = .( quarter, product ) ] %>%
setnames( c( "quarter", "product", "quarterly_revenue" ) )