【问题标题】:How to summarize value not matching the group using dplyr如何使用 dplyr 汇总与组不匹配的值
【发布时间】:2015-12-17 06:13:07
【问题描述】:

我想对属于行组以外的组的行的值求和。例如使用这个示例数据

> df <- data.frame(id=1:5, group=c("A", "A", "B", "B", "A"), val=seq(9, 1, -2))
> df
  id group val
1  1     A   9
2  2     A   7
3  3     B   5
4  4     B   3
5  5     A   1

dplyr分组总结

> df %>% group_by(group) %>% summarize(sumval = sum(val))
Source: local data frame [2 x 2]

   group sumval
  (fctr)  (dbl)
1      A     17
2      B      8

我想要的是属于 A 组的行的值,以使用非 A 组的 sumval。即最终结果是

  id group val notval
1  1     A   9      8
2  2     A   7      8
3  3     B   5     17
4  4     B   3     17
5  5     A   1      8

有没有办法在dplyr 中做到这一点?最好是单链?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以通过base R 做到这一点

     s1 <- sapply(unique(df$group), function(x) sum(df$val[df$group !=x]))
     s1[with(df, match(group, unique(group)))]
     #[1]  8  8 17 17  8
    

    或使用data.table

    library(data.table)
    setDT(df)[,notval := sum(df$val[df$group!=group]) ,group]
    

    【讨论】:

      【解决方案2】:

      @akrun 的答案是最好的。但是如果你想在dplyr做的话,这是一个迂回的方式。

      df <- data.frame(id=1:5, group=c("A", "A", "B", "B", "A"), val=seq(9, 1, -2))
      
      
      
          df %>% mutate(TotalSum = sum(val)) %>% group_by(group) %>%
       mutate(valsumval = TotalSum - sum(val))
      
      Source: local data frame [5 x 5]
      Groups: group [2]
      
               id  group   val TotalSum valsumval
            (int) (fctr) (dbl)    (dbl)     (dbl)
          1     1      A     9       25         8
          2     2      A     7       25         8
          3     3      B     5       25        17
          4     4      B     3       25        17
          5     5      A     1       25         8
      

      即使有两个以上的组,这也有效。

      这也有效

      df %>% group_by(group) %>% mutate(notval = sum(df$val)- sum(val))
      

      【讨论】:

      • 我认为您不需要创建TotalSumdf %&gt;% group_by(group) %&gt;% mutate(notval = sum(df$val)- sum(val))
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      相关资源
      最近更新 更多