加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何使用dplyr根据组上的聚合函数计算新列?

发布时间:2020-12-14 04:53:42 所属栏目:百科 来源:网络整理
导读:我经常需要计算R数据帧的新列(长格式),其值应取决于组的聚合函数(例如总和).例如,我可能想知道任何一天产品占销售额的比例: daily fraction = revenue for product i on day d / sum or revenue for all products on day d 我目前的策略是总结和加入: libr
我经常需要计算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,3,3),product = rep(c("A","B"),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
  )

这使

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)会被回收以填充组中的所有行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读