【问题标题】:How to apply a library command on each row and create a new variable如何在每一行上应用库命令并创建一个新变量
【发布时间】:2011-02-14 21:53:22
【问题描述】:

我在使用 ineq() 库中的命令创建新变量时遇到了一点麻烦,该库计算基尼系数。我给 ineq 命令的向量是我感兴趣的列的列表。我想为每一行运行这个命令,然后附加新变量。

当我尝试将其作为循环或使用 ddply(我现在正在学习)时,每行的输出是相同的 Gini 分数(对于整个数据集)。

如何为每一行运行此命令?提前致谢!

library(ineq)
df <- data.frame( user = 1:5, v1 = c(2,4,6,8,10), v2 = c(1,5,11,5,1), v3 = c(3,1,2,7,9))

for (i in nrow(df)) {
  df$gini <- ineq(c(df$v1, df$v2, df$v3))
}

myGini <- ddply(df, .(user), gini=ineq(c(v1, v2, v3)))

【问题讨论】:

    标签: r plyr


    【解决方案1】:

    您与以前的情况非常接近。您缺少将列添加到现有数据框的参数 transformsummarise 是另一个与 plyr 函数一起使用的便捷函数。

    myGini <- ddply(df, .(user), transform, gini=ineq(c(v1, v2, v3)))
    

    或者,您可以将 data.frame 视为一个数组并逐行操作:

    adply(df, 1, transform, gini = ineq(c(v1, v2, v3)))
    
    or
    
    adply(df, 1, function(x) gini = ineq(x[-1]))
    

    【讨论】:

    • 我对 plyr 不是很熟悉,adply 是否与 apply 相同,但对于数组?还是速度上也有差异?
    • @Sacha - 我将推迟到 website ,特别是 intro guide 的细节,但在我看来 - plyr 包的好处是你可以明确定义输入和输出类型。我经常发现自己与基地apply 家庭试图强制进出列表等纠缠不清。我不知道任何性能优势,但我不记得有人说plyr 比基本应用功能,所以我认为你不会失去任何性能。
    • 另外,性能是您应该优化的最后项,而不是第一项。您的代码将在 18 个月内速度翻倍,但不会变得更容易理解。
    【解决方案2】:

    这个包或者函数我不熟悉,但是你要找的函数大概是apply()

    df <- data.frame( user = 1:5, v1 = c(2,4,6,8,10), v2 = c(1,5,11,5,1), v3 = c(3,1,2,7,9))
    df$gini <- apply(df[,-1],1,ineq)
    

    编辑:

    另外,你的循环不起作用的原因是双重的,首先你需要在循环中使用索引,其次你需要循环一个向量:1:nrow(df) 而不仅仅是 nrow(df):

    df <- data.frame( user = 1:5, v1 = c(2,4,6,8,10), v2 = c(1,5,11,5,1), v3 = c(3,1,2,7,9))
    
    for (i in 1:nrow(df)) {
      df$gini[i] <- ineq(c(df$v1[i], df$v2[i], df$v3[i]))
    }
    

    【讨论】:

    • 上面的代码将在ineq 计算中包含user 列,这不是我认为的OP。您可以将您的代码修改为 df$gini &lt;- apply(df[, -1],1,ineq) 以在 v1 v2v3 上计算 ineq
    • 我想我在你输入评论时编辑了这个(或其他方式):)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 2018-10-15
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    相关资源
    最近更新 更多