数据帧中列的有效乘法

Dou*_*oug 9 r plyr dataframe

我有一个大型数据框,我将两列相乘以获得另一列.起初我正在运行for循环,如下所示:

for(i in 1:nrow(df)){
    df$new_column[i] <- df$column1[i] * df$column2[i]
}
Run Code Online (Sandbox Code Playgroud)

但这需要9天.

另一种选择是plyr,我实际上可能错误地使用了这些变量:

new_df <- ddply(df, .(column1,column2), transform, new_column = column1 * column2)
Run Code Online (Sandbox Code Playgroud)

Sac*_*amp 21

正如Blue Magister在评论中所说,

df$new_column <- df$column1 * df$column2
Run Code Online (Sandbox Code Playgroud)

应该工作得很好.当然,我们永远无法确定我们是否没有数据示例.

  • 更漂亮,但基本相同:`df $ new_column < - with(df,column1*column2)` (4认同)
  • 因此,如果可以,请批量添加列,而不是逐个添加.因为即使在20MB大小也可以咬人.万一这将是你的下一步.或者,使用`:=`,它不会复制整个20MB. (2认同)

mne*_*nel 11

data.table同时具有不飞散的代码的优点溶液将避免大量的内部拷贝的 $.

 library(data.table)
 DT <- data.table(df)
 DT[ , new := column1 * column2]
Run Code Online (Sandbox Code Playgroud)


Rei*_*son 10

Sacha的答案的一个次要的,效率稍低的版本是使用transform()within()

df <- transform(df, new = column1 * column2)
Run Code Online (Sandbox Code Playgroud)

要么

df <- within(df, new <- column1 * column2)
Run Code Online (Sandbox Code Playgroud)

(我讨厌用我的用户代码$.)

  • @GaborCsardi不幸的是,`$ < - `没有优化不复制R; 它复制_entire_`df`.和`transform`和`within`一样; 他们也复制_entire_`df`.这就是为什么`data.table`引入`:=`,允许通过引用分配,如mnel的答案中的demo. (2认同)