常常我需要計算用於R數據幀的新列(在長形式),衛生組織值應取決於一組的聚集函數(例如和)。舉例來說,我可能會想知道一個產品佔某一天哪些部分銷售:如何使用dplyr根據組上的聚合函數計算新列?
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'似乎工作:'數據%>%GROUP_BY(天)%>%變異(daily_revenue = SUM(收益),revenue_fraction =營業收入/ daily_revenue)'。我會考慮將daily_revenue保持爲反模式,如果在任何地方都屬於日級別的某個單獨表格(如摘要文件)。 – Frank