r - 在 R 中以多线程方式将函数应用于 DataFrame 或矩阵中的每个单元格

标签 r multithreading

是否可以在 R 中以多线程方式将函数应用于 DataFrame/矩阵中的每个单元格?

我知道 apply() 但它似乎本身不允许多线程:

x <- cbind(x1 = 3, x2 = c(4:1, 2:5))

cave <- function(x, c1, c2) {
  a = 1000
  for (i in 1:100) { # Useless busy work
    b=matrix(runif(a*a), nrow = a, ncol=a)
  }
  c1 + c2 * x      
}

apply(x, 1, cave,  c1 = 3, c2 = 4)

返回:

   [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
x1   15   15   15   15   15   15   15   15
x2   19   15   11    7   11   15   19   23

相反,我想使用多个核心来执行该操作,因为应用的功能可能很复杂。例如,可以 apply a function to each cell in DataFrame multithreadedly in pandas .

最佳答案

可能有几种方法可以做到这一点,但我总是发现对列表对象运行并行操作是最简单的。如果将输入矩阵转换为列表,则可以使用parallel::parLapply 应用该函数,如下所示:

## convert the input object to a list
x.list <- split(t(x), rep(1:nrow(x), each = ncol(x)))

## parallelize the operation over e.g. 2 cores
cl <- parallel::makeCluster(2)
out <- parallel::parLapply(cl, x.list, cave, c1 = 3, c2 = 4)
parallel::stopCluster(cl)

## transform the output list back to a matrix
out <- t(matrix(unlist(out, use.names = FALSE), nrow = ncol(x)))
colnames(out) <- colnames(x)

这应该可以跨平台工作。

> x
     x1 x2
[1,]  3  4
[2,]  3  3
[3,]  3  2
[4,]  3  1
[5,]  3  2
[6,]  3  3
[7,]  3  4
[8,]  3  5
> out
     x1 x2
[1,] 15 19
[2,] 15 15
[3,] 15 11
[4,] 15  7
[5,] 15 11
[6,] 15 15
[7,] 15 19
[8,] 15 23

关于r - 在 R 中以多线程方式将函数应用于 DataFrame 或矩阵中的每个单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45154424/

相关文章:

java - 如何在 Blackberry 中安排特定线程

C#线程方法

python - 处理大量线程和数据库连接 (Python) 我可以做些什么来节省资源?

r - R 中的交叉连接与过滤/匹配

r - R中基于grep返回的代码新变量

regex - 在字符串中使用正则表达式进行模式匹配

python - 使用 Flask Web 应用程序监控实时数据流

r - 更改 chart.Correlation() 下对角线中的点字符

r - 如何在同一个 R 散点图中绘制多个系列?

java - 线程同步——如何交替执行线程