我想对属于除行的组以外的组的行的值进行求和.例如,使用此示例数据
> 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
?最好是单链?
我们可以这样做 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]
@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))