繁体   English   中英

R 中的并行计算(foreach 循环和 if 语句)

[英]Parallel computing in R (foreach loop and if statements)

我一直在尝试调整我的一些代码以并行工作,因为我正在处理的信息不是连续的。 这个想法是,我正在浏览几个表并处理它们的条目,根据它们的原始值将它们的值更改为 1、2 或 3。 我当前的代码如下所示:

typeof(Table)
[1] "list"
dim(Table)
[1] 5001 1247

Processed_Table <- Table

for (i in 2:length(Table))             # Iterating through the columns
  for (j in 1:(length(Table[,2])-1)){  # Iterating through the lines
    if (Table[j,i] > 9) {              # Updating the values based on their range
      Processed_Table[j,i] <- 1 
    } else if (9 > Table[j,i] && Table[j,i] > 5.5){
      Processed_Table[j,i] <- 2 
    } else if (Table[j,i]<5.5){
      Processed_Table[j,i] <- 3 
    }
  }
}

由于我的表很大而且我有几个,我正在考虑通过使用并行库并为循环中的每一列或每一行使用一个核心来并行化这个任务。 我很难理解如何做到这一点,因为这些值不会自动更新(据我所知,工人中的数字实际上并没有保存在原始变量中)。 这是我试图做但失败的事情:

library(parallel)

n.cores <- parallel::detectCores() - 1

my.cluster <- parallel::makeCluster(
  n.cores, 
  type = "PSOCK"
)

doParallel::registerDoParallel(cl = my.cluster)

Processed_Table<-foreach(j = 1:(length(Table[,2])-1),.combine = 'cbind') %dopar% {
                   for (i in 2:length(Table)) {
                     if (Table[j,i] > 9) { 
                               1 
                     } else if (9 > Table[j,i] && Table[j,i] > 5.5){
                               2 
                     } else if (Table<5.5){
                               3 
                     }
                   }
                 }

在此先感谢您的帮助!

我建议使用“cut()”函数,它是矢量化的,并且比 for 循环运行得快得多。 如果您将数据框的相关列转换为矩阵,“cut()”将返回一个矩阵,您可以将其与数据中的其他列重新组合。

我不完全确定您为什么要使用并行计算,所以我将提供一般性建议(行太多?列?两者?)。 请注意,数据框只是向量列表。 mclapply 函数将很高兴地在列上工作,您可以使用如下代码:

new_columns <- mclapply(Table[, -1], cut, breaks = c(-Inf, 5.5, 9, Inf), labels = FALSE)

然后是'do.call(cbind,new_columns)'之类的东西,然后将其附加到其他列。

根据您的数据有多大,您可以只使用矢量化函数。 这是一种使用dplyr处理一个表的方法(您可以在循环/ lapply中对所有表使用该方法)。 请注意,您在方法中使用>而不是>=错过了值 9 和 5.5 。

library(dplyr)

# assuming your Table is a data.frame
Table <- Table %>% 
  # assuming your first column is called ID, this column is excluded
  mutate(across(-ID, ~case_when(.x > 9 ~ 1,
                                .x <= 9 & > 5.5 ~ 2,
                                .x <= 5.5 ~ 3)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM