我经常需要为R数据帧(长格式)计算新列,其值应取决于组的聚合函数(例如总和)。例如,我可能想知道任何一天产品占销售额的比例:
daily fraction = revenue for product i on day d / sum or revenue for all products on day d
我目前的策略是总结并加入:
library(dplyr)
join_summary <- function(data, ...) left_join(data, summarise(data, ...))
data = data.frame(
day = c(1,1,2,2,3,3),
product = rep(c("A", "B"), 3),
revenue = c(2, 4, 8, 7, 9, 2)
)
data2 <- data %>%
group_by(day) %>%
join_summary(daily_revenue = sum(revenue)) %>%
mutate(revenue_fraction = revenue / daily_revenue)
这有效,但我不确定它是否是反模式。在多行上重复相同的数据(每日收入)似乎有点低效,使用聚合乱丢我的数据框。我的问题是:
dplyr
或更广泛的Hadleyverse的工具?join_summary
,还是可以使用现有的dplyr
动词完成? (尽管如此,我更愿意留在&#34;管道流#34;)答案 0 :(得分:7)
除了使用summarise
进行汇总外,您还可以使用mutate
将摘要统计信息分配到完整列:
data %>%
group_by(day) %>%
mutate(
daily_revenue = sum(revenue),
revenue_fraction = revenue / daily_revenue
)
给出了
Source: local data frame [6 x 5]
Groups: day [3]
day product revenue daily_revenue revenue_fraction
<dbl> <fctr> <dbl> <dbl> <dbl>
1 1 A 2 6 0.3333333
2 1 B 4 6 0.6666667
3 2 A 8 15 0.5333333
4 2 B 7 15 0.4666667
5 3 A 9 11 0.8181818
6 3 B 2 11 0.1818182
这是有效的,因为值sum(revenue)
被回收以填充组中的所有行。