从R中的并行sapply中设置矩阵行中的值

从R中的并行sapply中设置矩阵行中的值,r,global-variables,apply,R,Global Variables,Apply,我有一个矩阵(origmatrix),我想在它上对每列执行一个函数。我想把这个函数的结果放入另一个矩阵(newmatrix),该行的行号对应于原始矩阵中的列号。在真实的数据集中,有20000行具有复杂的函数,因此我想使用一种类型的apply,以便能够并行化项目。我有没有办法从apply into newmatrix中获取数据?任何帮助都将不胜感激 origmatrix = matrix(1:50, 10, 5) colnames(origmatrix) = letters[1:5] newmat

我有一个矩阵(origmatrix),我想在它上对每列执行一个函数。我想把这个函数的结果放入另一个矩阵(newmatrix),该行的行号对应于原始矩阵中的列号。在真实的数据集中,有20000行具有复杂的函数,因此我想使用一种类型的apply,以便能够并行化项目。我有没有办法从apply into newmatrix中获取数据?任何帮助都将不胜感激

origmatrix = matrix(1:50, 10, 5)
colnames(origmatrix) = letters[1:5]
newmatrix = matrix(0, 5,2)
colnames(newmatrix) = c("Identifier","mean")

boertje = function (x){
  newlist[which(colnames(origmatrix)==x),2]= mean(origmatrix[,x])
}
sapply(colnames(origmatrix), boertje)

如何使用多核版本的
lappy
,它是
并行:::mclappy
多核:::mclappy
,具体取决于您的平台,然后根据结果生成数据帧?当您返回多个值时,可以创建一个数据帧,如下所示:

require(parallel)
res <- mclapply( 1:ncol(origmatrix) , mc.cores = 1 , function(x){ c( mean( origmatrix[,x] ) , sd( origmatrix[,x] ) , var( origmatrix[,x] ) ) } )

# So the first element of the resulting list looks like
 res[[1]]
  # [1] 5.500000 3.027650 9.166667

df <- as.data.frame( res )
rownames(df) <- c("mean","sd","var")
colnames(df) <- colnames(origmatrix)
#               a         b         c         d         e
#   mean 5.500000 15.500000 25.500000 35.500000 45.500000
#   sd   3.027650  3.027650  3.027650  3.027650  3.027650
#   var  9.166667  9.166667  9.166667  9.166667  9.166667
require(并行)

res当我需要从函数返回1个值时,这非常有效。当我的函数应该返回3个值tho(在本例中,是三明治包中的一个系数)时,我似乎无法让它工作。我尝试过使用
newmatrix[,2:5]=unlist(…)
,但这似乎也不起作用。@Xizam也许您可以更新这个问题,以显示如何在函数中返回值(一个由3个值组成的列表?),我们可以从那里开始?如果有多个值,是否希望每个值都显示在单独的列中?我不想为您猜测解决方案,所以如果您可以显式地声明返回值的结构会更好!:-)@我已经更新了Xizam。也许编辑会解决你的问题?