如何并行化循环以替换 R 中的单元格

问题描述

我正在尝试并行化一个嵌套循环,在其中我替换两个数据集之间的公共变量 (changevars),在其中的每个国家 (v5) 内,每个观察都使用其 id (v3)。我必须使用国家/地区+ ID,因为国家/地区之间的 ID 重复。

我的循环代码是:

for (var in changevars) {

print(var)

for (i in unique(int2006$v5)) {

print(i)

for (id in unique(int2006$v3)) {

x2006r[x2006r$v5 == i & x2006r$v3 == id,var] <- int2006[int2006$v5 == i & int2006$v3 == id,var]    

}

}

}

我想并行化它。

虽然有效,但是真的很慢。而且我不明白从 for 更改为 foreach 循环和 dopar 背后的逻辑。我试图理解其他答案,但我的尝试都失败了。

可重现的数据集示例:

  1. 源数据集
> dput(int2006)
structure(list(v3 = c(10001,10002,10003,10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019,10020),v5 = c(36,36,36),v7 = c(3606,3606,3606),v8 = c(1,1,2,NA,2),v9 = c(NA,4,2)),row.names = c(NA,20L),class = "data.frame")
  1. 目标数据集(应将 1 的单元格复制到的数据集):
    > dput(x2006r)
structure(list(v3 = c(10001,v7 = c("3606","3606","3606"),2
    )),class = "data.frame")
  1. 要迭代的变量
changevars <- c("v7","v8","v9")

有人可以帮我吗?我真的被困住了。另外,我不确定并行化这个循环是否会帮助我提高速度。

非常感谢!

解决方法

这是一种称为“更新连接”的常见操作。一个新的 dplyr 实用函数使它变得非常简单:

library(dplyr)
join_vars <- c("v3","v5")
changevars <- c("v7","v8","v9")
result <- rows_update(x = x2006r,y = int2006[c(join_vars,changevars)],by = join_vars)

如果您确实想推出自己的产品,请至少启动 with a join。您可以看到一些 dplyr-based implementations here。我相信 data.table 在这方面也做得很好。