gpt4 book ai didi

performance - 使用 foreach 和 %dopar% 将列添加到数据框

转载 作者:行者123 更新时间:2023-12-02 16:02:43 25 4
gpt4 key购买 nike

在 Windows 7 和 Ubuntu 64 位 11.04 上的 Revolution R 2.12.2 中,我有一个包含超过 100K 行和超过 100 列的数据框,并且我为每个导出约 5 列(sqrt、log、log10 等)原始列并将它们添加到同一数据框中。如果没有使用 foreach 和 %do% 的并行性,这可以正常工作,但速度很慢。当我尝试将其与 foreach 和 %dopar% 并行化时,它不会访问全局环境(以防止竞争条件或类似情况),因此我无法修改数据框,因为“未找到数据框对象”。

我的问题是如何才能加快速度?换句话说,如何并行化列或转换?

简化示例:

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 中的 := 运算符通过引用添加列。您需要 with=FALSE,以便可以将对 paste 的调用放在 := 的 LHS 上。

参见When should I use the := operator in data.table?

关于performance - 使用 foreach 和 %dopar% 将列添加到数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7909523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com