根据其他两列的汇总添加新列

时间:2020-03-21 02:52:37

标签: r dataframe aggregate

使用数据框

(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

2 个答案:

答案 0 :(得分:4)

她正在进行中。您可以使用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

答案 1 :(得分:1)

在基数R中,我们可以使用gcc -c main.c gfortran -c integration.f95 g++ -o intsinq main.o integration.o 将函数应用于每个组,以保持行数相同。

brew update && brew upgrade
brew uninstall openssl; brew uninstall openssl; brew install https://github.com/tebelorg/Tump/releases/download/v1.0.0/openssl.rb

ave的默认d$y <- with(d, x - ave(x, F)) #Explicitly mentioning the function name #d$y <- with(d, x - ave(x, F, FUN = mean)) d # 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 参数为ave