2

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

2 回答 2

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]))
于 2011-02-14T22:04:55.523 回答
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):

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]))
}
于 2011-02-14T21:59:50.520 回答