我想对属于除行组之外的组的行的值求和。例如,使用此示例数据
> 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
中执行此操作?最好是单链?
答案 0 :(得分:10)
我们可以使用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]
答案 1 :(得分:8)
@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))