12

我有一个大数据框,我在其中将两列相乘以获得另一列。起初我正在运行一个 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)

但这需要永远

4

4 回答 4

26

正如蓝魔导师在评论中所说,

df$new_column <- df$column1 * df$column2

应该可以正常工作。当然,如果我们没有数据示例,我们永远无法确定。

于 2012-09-10T18:44:31.007 回答
12

一种data.table解决方案将避免大量内部复制,同时具有不使用 $.

 library(data.table)
 DT <- data.table(df)
 DT[ , new := column1 * column2]
于 2012-09-10T20:07:46.270 回答
11

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

df <- transform(df, new = column1 * column2)

或者

df <- within(df, new <- column1 * column2)

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

于 2012-09-10T18:49:33.593 回答
1

您可以简单地创建一个函数来处理所有类型的乘法,如下所示:

GetMultiplication <- function(x,y) {
x *y
}

# for example:
xCol<-c(1,2,3,4,5)
yCol<-c(10,20,30,40,50)
const = 0.055

#Case 1: Column 1 * Column 2
ZCol_1 <- GetMultiplication (xCol,yCol)
print(ZCol_1)
#> [1]  10  40  90 160 250

#Case 2: Column 1 * (Column 1 * 10 + 1000)
ZCol_2 <- GetMultiplication (xCol,xCol*10 + 1000)
print(ZCol_2)
#> [1] 1010 2040 3090 4160 5250

#Case 3: Column 1 * a constant value
ZCol_3 <- GetMultiplication (xCol,const)
print(ZCol_3)
#> [1] 0.055 0.110 0.165 0.220 0.275
于 2020-10-03T22:25:34.147 回答