当前位置:  开发笔记 > 编程语言 > 正文

如何使用dplyr汇总与组不匹配的值

如何解决《如何使用dplyr汇总与组不匹配的值》经验,为你挑选了2个好方法。

我想对属于除行的组以外的组的行的值进行求和.例如,使用此示例数据

> 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组的行使用sumval非A组的值.即最终结果是

  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?最好是单链?



1> akrun..:

我们可以这样做 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> Koundy..:

@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))

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有