【问题标题】:R create new column using all rows with a particular value [duplicate]R使用具有特定值的所有行创建新列[重复]
【发布时间】:2014-08-25 18:28:37
【问题描述】:

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

例如:

mtcars

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

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

【问题讨论】:

    标签: r


    【解决方案1】:

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

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

    avecyl 定义的mpg 的子组上计算FUNtransform 允许您向数据框添加/修改列,还可以在数据框的上下文中评估表达式(因此您不必输入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))
    

    【讨论】:

    • 有像 ave 这样的函数家族吗?如果我想求和而不是平均怎么办?或得到等的标准差。
    • 非虚拟机。愚蠢的问题。 ave 有一个函数参数
    • ave 不代表averageave 将您选择的函数应用于每个子组。注意FUN=mean 部分通话。您可以将FUN 更改为sumsd 等。
    【解决方案2】:

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

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

    【讨论】:

    • 我注意到data.tableddply 都没有像transform 那样保留行名。对于data.table,有一个keep.rownames 选项。 dplyr 有类似的东西吗?
    • @BrodieG:这是一个很好的观点。 Hadley intentionally designed dplyr 丢弃行名,所以唯一要做的就是先将它们添加为另一列。
    猜你喜欢
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 2015-08-24
    • 2018-05-09
    • 2020-07-08
    • 2018-12-13
    • 2017-11-26
    相关资源
    最近更新 更多