【问题标题】:Dplyr equivalent of SUM over PARTITION BYDplyr 相当于 SUM over PARTITION BY
【发布时间】:2019-02-02 19:49:43
【问题描述】:

我确定以前有人问过这个问题,但我找不到答案。

这是我的数据:

df <- data.frame(group=c("a","a","a","b","b","c"), value=c(1,2,3,4,5,7))
df
#>   group value
#> 1     a     1
#> 2     a     2
#> 3     a     3
#> 4     b     4
#> 5     b     5
#> 6     c     7

我想要第三列,其中包含每个“组”的“价值”总和,如下所示:

#>   group value group_sum
#> 1     a     1         6
#> 2     a     2         6
#> 3     a     3         6
#> 4     b     4         9
#> 5     b     5         9
#> 6     c     7         7

如何使用 dplyr 做到这一点?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    使用 dplyr -

    df %>%
        group_by(group) %>%
        mutate(group_sum = sum(value))
    

    【讨论】:

      【解决方案2】:

      还没有人提到data.table

      library(data.table)
      
      dat <- data.table(df)
      
      dat[, `:=`(sums = sum(value)), group]
      

      dat 转换为:

         group value sums
      1:     a     1    6
      2:     a     2    6
      3:     a     3    6
      4:     b     4    9
      5:     b     5    9
      6:     c     7    7
      

      【讨论】:

        【解决方案3】:
        left_join(
          df,
          df %>% group_by(group) %>% summarise(group_sum = sum(value)),
          by = c("group")
        )
        

        【讨论】:

          【解决方案4】:

          我不知道怎么一步,但是

          df_avg <- df %>% group_by(group) %>% summarize(group_sum=sum(value))  
          df %>% full_join(df_avg,by="group")
          

          有效。 (这基本上相当于@KeqiangLi 的回答。)

          ave(),来自基础 R,在这里也很有用:

          df %>% mutate(group_sum=ave(value,group,FUN=sum))
          

          【讨论】:

          • ave() 函数正是我想要的——谢谢
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-19
          • 1970-01-01
          • 2019-02-26
          相关资源
          最近更新 更多