在 Windows 7和Ubuntu 64位11.04的Revolution R 2.12.2中,我有一个超过100K行和超过100列的数据帧,我为每个原始列派生了~5列(sqrt,log,log10等)并将它们添加到同一数据框中.如果没有使用foreach和%do%
我的问题是如何让它更快?换句话说,如何并行化列或转换?
简化示例:
require(foreach) require(doSMP) w <- startWorkers() registerDoSMP(w) transform_features <- function() { cols<-c(1,2,3,4) # in my real code I select certain columns (not all) foreach(thiscol=cols, mydata) %dopar% { name <- names(mydata)[thiscol] print(paste('transforming variable ', name)) mydata[,paste(name, 'sqrt', sep='_')] <<- sqrt(mydata[,thiscol]) mydata[,paste(name, 'log', sep='_')] <<- log(mydata[,thiscol]) } } n<-10 # I often have 100K-1M rows mydata <- data.frame( a=runif(n,1,100), b=runif(n,1,100), c=runif(n,1,100), d=runif(n,1,100) ) ncol(mydata) # 4 columns transform_features() ncol(mydata) # if it works, there should be 8
请注意,如果将%dopar%更改为%do%,则可以正常工作
在data.table
中尝试:=运算符以按引用添加列.您需要使用= FALSE,这样您就可以将调用粘贴到LHS上:=.
见When should I use the := operator in data.table?