R:将数据帧的每一行转换成列表项

我有一些数据帧操作,我想加快使用mclapply()或其他lapply()的功能。使我能够与之搏斗的最简单的方法之一是使数据帧的每一行都在列表中的一个小数据帧。我可以很容易地用plyr这样做:

df <- data.frame( a=rnorm(1e4), b=rnorm(1e4))
require(plyr)
system.time(myList <- alply( df, 1, function(x) data.frame(x) ))

一旦我把数据作为一个列表,我可以轻松地做如下事情:

mclapply( myList, function(x) doSomething(x$a) )

这可以游泳,但是我有相当多的数据,而adply()的步骤相当慢。我尝试在adply步骤上使用多核并行后端,但即使我已经注册了8,它从未使用过多个处理器。我怀疑并行选项可能无法与此类型的问题一起使用。

关于如何使这个更快的任何提示?也许是R基地的解决方案?

最佳答案
只需使用拆分。这比你的广告线快几倍。

> system.time(myList <- alply( df, 1, function(x) data.frame(x) ))
   user  system elapsed 
   7.53    0.00    7.57 
> system.time( splitList <- split(df, 1:NROW(df)) )
   user  system elapsed 
   1.73    0.00    1.74 
> 

我怀疑并行后端应用于功能评估(不分裂和重新组合)。

更新:
如果您可以将data.frame转换为矩阵,下面的解决方案将是über-fast。您可能可以使用split,但它会删除名称并返回每个列表元素中的向量。

> m <- as.matrix(df)
> system.time( matrixList <- lapply(1:NROW(m), function(i) m[i,,drop=FALSE]) )
   user  system elapsed 
   0.02    0.00    0.02
> str(matrixList[[1]])
 num [1, 1:2] -0.0956 -1.5887
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:2] "a" "b"
> system.time( matrixSplitList <- split(m, 1:NROW(m)) )
   user  system elapsed 
   0.01    0.00    0.02 
> str(matrixSplitList[[1]])
 num [1:2] -0.0956 -1.5887

转载注明原文:R:将数据帧的每一行转换成列表项 - 代码日志