r - 根据其他两列的聚合添加新列
问题描述
使用数据框
(d <- data.frame(x = c(22, 2, 14, 3, 50, 11), E= rep(c('C','D'), each=3), F = rep(c('A','B'), 3)))
x E F
1 22 C A
2 2 C B
3 14 C A
4 3 D B
5 50 D A
6 11 D B
我想为因子“F”的每个级别聚合列“x”,如下所示:
(y <- aggregate(x ~ F, d, function(x) x-mean(x)))
F x.1 x.2 x.3
1 A -6.666667 -14.666667 21.333333
2 B -3.333333 -2.333333 5.666667
什么是使用命令的优雅方式,以便可以将上述聚合结果附加到原始数据帧,如下所示?
x E F y
1 22 C A -6.666667
2 2 C B -3.333333
3 14 C A -14.666667
4 3 D B -2.333333
5 50 D A 21.333333
6 11 D B 5.666667
解决方案
她的正在路上。您使用 定义组F
。对于每个组,您要从 中减去平均值x
。
library(dplyr)
group_by(d, F) %>%
mutate(result = x - mean(x))
x E F result
<dbl> <fct> <fct> <dbl>
1 22 C A -6.67
2 2 C B -3.33
3 14 C A -14.7
4 3 D B -2.33
5 50 D A 21.3
6 11 D B 5.67
如果您使用 data.table 包,您可以通过以下方式实现相同的目的。
library(data.table)
setDT(d)[, result := x - mean(x), by = F][]
x E F result
1: 22 C A -6.666667
2: 2 C B -3.333333
3: 14 C A -14.666667
4: 3 D B -2.333333
5: 50 D A 21.333333
6: 11 D B 5.666667