如何并行化循环以替换 R 中的单元格
How to Parallelize Loop to substitute cells in R
我正在尝试并行化一个嵌套循环,在其中我用两个数据集之间的公共变量 (changevars) 代替其中的每个国家 (v5),每个观察都使用其 id (v3)。我必须使用 country+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
的变化背后的逻辑。我试图理解其他答案,但我的尝试都失败了。
数据集的可重现示例:
- 源数据集
> 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, 36, 36,
36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36),
v7 = c(3606, 3606, 3606, 3606, 3606, 3606, 3606, 3606, 3606,
3606, 3606, 3606, 3606, 3606, 3606, 3606, 3606, 3606, 3606,
3606), v8 = c(1, 1, 2, 1, NA, NA, 1, 2, 2, 2, NA, 2, 2, 1,
1, 1, 2, 2, 1, 2), v9 = c(NA, 2, 1, 2, 1, 1, 1, 2, 4, 1,
NA, 1, NA, 1, 1, 1, 1, 1, 1, 2)), row.names = c(NA, 20L), class = "data.frame")
- 目标数据集(1 的单元格应复制到的数据集):
> dput(x2006r)
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, 36, 36,
36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36),
v7 = c("3606", "3606", "3606", "3606", "3606", "3606", "3606",
"3606", "3606", "3606", "3606", "3606", "3606", "3606", "3606",
"3606", "3606", "3606", "3606", "3606"), v8 = c(1, 1, 2,
1, NA, NA, 1, 2, 2, 2, NA, 2, 2, 1, 1, 1, 2, 2, 1, 2), v9 = c(NA,
2, 1, 2, 1, 1, 1, 2, 4, 1, NA, 1, NA, 1, 1, 1, 1, 1, 1, 2
)), row.names = c(NA, 20L), class = "data.frame")
- 要迭代的变量
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
. You can see a few 。我相信 data.table
也做得很好。
我正在尝试并行化一个嵌套循环,在其中我用两个数据集之间的公共变量 (changevars) 代替其中的每个国家 (v5),每个观察都使用其 id (v3)。我必须使用 country+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
的变化背后的逻辑。我试图理解其他答案,但我的尝试都失败了。
数据集的可重现示例:
- 源数据集
> 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, 36, 36,
36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36),
v7 = c(3606, 3606, 3606, 3606, 3606, 3606, 3606, 3606, 3606,
3606, 3606, 3606, 3606, 3606, 3606, 3606, 3606, 3606, 3606,
3606), v8 = c(1, 1, 2, 1, NA, NA, 1, 2, 2, 2, NA, 2, 2, 1,
1, 1, 2, 2, 1, 2), v9 = c(NA, 2, 1, 2, 1, 1, 1, 2, 4, 1,
NA, 1, NA, 1, 1, 1, 1, 1, 1, 2)), row.names = c(NA, 20L), class = "data.frame")
- 目标数据集(1 的单元格应复制到的数据集):
> dput(x2006r)
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, 36, 36,
36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36),
v7 = c("3606", "3606", "3606", "3606", "3606", "3606", "3606",
"3606", "3606", "3606", "3606", "3606", "3606", "3606", "3606",
"3606", "3606", "3606", "3606", "3606"), v8 = c(1, 1, 2,
1, NA, NA, 1, 2, 2, 2, NA, 2, 2, 1, 1, 1, 2, 2, 1, 2), v9 = c(NA,
2, 1, 2, 1, 1, 1, 2, 4, 1, NA, 1, NA, 1, 1, 1, 1, 1, 1, 2
)), row.names = c(NA, 20L), class = "data.frame")
- 要迭代的变量
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
. You can see a few data.table
也做得很好。