【发布时间】:2012-09-03 16:02:07
【问题描述】:
我有一个大型数据框,其中我将两列相乘以获得另一列。起初我正在运行一个 for 循环,如下所示:
for(i in 1:nrow(df)){
df$new_column[i] <- df$column1[i] * df$column2[i]
}
但这需要 9 天。
另一种选择是plyr,实际上我可能错误地使用了变量:
new_df <- ddply(df, .(column1,column2), transform, new_column = column1 * column2)
但这需要很长时间
【问题讨论】:
-
df$new_column <- df$column1 * df$column2有什么问题?你的数据框有多大? -
400000 行即使使用 plyr 也应该很快......但如果你只是想将两列相乘,@BlueMagister 有最好的解决方案。即便如此,for 循环版本也不应该花费 9 天...
-
R中的大多数操作都是向量化的,因此您可以将向量乘以向量,它会将相同索引的条目相乘。 for 循环的问题是R为循环的每次迭代创建一个新的数据框。我建议的解决方案只创建一个新数据帧,而不是 400K 新数据帧。 -
“time-efficient”和“plyr”一般不在同一个句子中使用。如果速度是您的目标,您应该查看“data.table”包。 (......虽然现在 400K x 7 是一个很小的数据集,但您在下面的答案中提供的普通功能就足够了。)
-
plyr 在这里这么慢的原因是您不必要地对 column1 和 column2 进行分组。这会为这些列的每个唯一组合创建组。 ddply 不是必需的。 data.table 将有效地创建新列。