【发布时间】:2017-07-01 23:51:19
【问题描述】:
我经常需要为 R 数据框(长格式)计算一个新列,其值应取决于组的聚合函数(例如 sum)。例如,我可能想知道某天某产品在销售额中所占的比例:
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动词来完成? (不过,我更喜欢留在“管道流”中。)
【问题讨论】:
-
如果这是您想要的输出,
mutate似乎可以工作:data %>% group_by(day) %>% mutate(daily_revenue = sum(revenue), revenue_fraction = revenue / daily_revenue)。我会考虑将 daily_revenue 保持为一种反模式,如果有的话,它属于一天级别的某个单独的表(比如你的摘要表)。 -
这个问题是关于将每组统计数据(收入总和)加入原始数据帧,然后在汇总统计数据上计算汇总统计数据。因此,它与其他问题不同。
标签: r join dplyr aggregate summary