如何在每行上应用库命令并创建新变量

时间:2011-02-14 21:53:22

标签: r plyr

我在使用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)))

2 个答案:

答案 0 :(得分:3)

你和以前的人非常接近。您错过了参数transform,它将列添加到现有数据框中。 summarise是另一个与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]))

答案 1 :(得分:1)

我不熟悉这个软件包或函数,但您正在寻找的函数可能是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):< / p>

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]))
}