R使用具有特定值的所有行创建新列

时间:2014-08-25 18:28:38

标签: r

我想将数据框的新列定义为在特定列中具有特定值的所有其他行的函数。

例如:

mtcars

我想要每辆车的mpg和所有具有相同cyl的汽车的平均mpg之间的差异。它类似于下面的代码,但显然第二个mtcars $ cyl需要不同!

mtcars$dif_mpg = mtcars$mpg - mean(mtcars[mtcars$cyl == mtcars$cyl, ]$mpg)

2 个答案:

答案 0 :(得分:1)

这样的事情应该完成工作(在基础R中):

transform(mtcars, dif_mpg=mpg-ave(mpg, cyl, FUN=mean))

aveFUN定义的mpg子群上计算cyltransform允许您向数据框添加/修改列,还可以在数据框的上下文中计算表达式(因此您不必键入mtcars$mpg等)。以下是结果的前6行:

                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb     dif_mpg
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4  1.25714286
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4  1.25714286
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1 -3.86363636
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1  1.65714286
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2  3.60000000
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1 -1.64285714

其他替代方案包括dplyr包(如David Robinson所示),data.table

library(data.table)
(data.table(mtcars, keep.rownames=T)[, dif_mpg:=mpg - mean(mpg), by=cyl])

plyr(虽然您应该使用dplyr而不是plyr,因为速度要快得多):

library(plyr)
ddply(mtcars, "cyl", transform, dif_mpg=mpg-mean(mpg))

答案 1 :(得分:0)

dplyr包(您需要先安装)才能很好地处理这种分组操作。在这种情况下,解决方案将是:

library(dplyr)
mtcars <- mtcars %>% group_by(cyl) %>% mutate(dif_mpg=mpg - mean(mpg))