Как суммировать значение, не соответствующее группе, используя dplyr
Я хочу суммировать значения строк, принадлежащих группе, отличной от группы строк. Например, используя этот пример данных
> 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
То, что я хочу, это значение для строк, принадлежащих группе А, чтобы использовать 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
? Желательно в одной цепочке?
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))
Мы можем сделать это с 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]