3

我有一个矩阵(origmatrix),我想在其上每列执行一个函数。我想把这个函数的结果放到另一个矩阵(newmatrix)中,这一行的行号对应于原始矩阵中的列号。在真实数据集中有 20000 行具有复杂功能,所以我想使用一种类型的 apply 以便能够并行化项目。有没有办法让我从应用程序中获取数据到 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)
4

1 回答 1

5

使用多核版本怎么样lapplyparallel:::mclapply取决于multicore:::mclapply你的平台,然后从结果中制作一个数据框?当您返回多个值时,您可以创建一个数据框,如下所示:

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

mclapply虽然在帮助页面中确实带有此警告...

警告
强烈建议不要在 GUI 或嵌入式环境中使用这些功能,因为它会导致多个进程共享同一个 GUI,这可能会导致混乱(并可能导致崩溃)。子进程不应该使用屏幕上的图形设备。

于 2013-04-16T14:27:44.577 回答