【问题标题】:R: converting each row of a data frame into a list itemR:将数据框的每一行转换为列表项
【发布时间】:2011-02-24 21:32:20
【问题描述】:

我对数据帧有一些操作,我想使用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 解决方案?

【问题讨论】:

  • 你为什么不做alply(df, 1, function(x) doSomething(x), .parallel = TRUE)

标签: r parallel-processing multicore dataframe plyr


【解决方案1】:

只需使用split。它比您的adply 行快几倍。

> 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 
> 

我怀疑adply 上的并行后端仅用于函数评估(而不是拆分和重新组合)。

更新:
如果您可以将 data.frame 转换为矩阵,则以下解决方案将非常快速。您也许可以使用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

【讨论】:

  • 我认为你关于拆分和合并的结论是正确的。
  • 显然我今天的课程是,“矩阵上的一切都更快”
  • 更公平的比较是system.time(myList &lt;- alply( df, 1, identity )),但仍然需要很长时间:(
  • 如果只有 R 有一个快速函数来为对象下标任意数量的维度,它应该可以让它像拆分一样快。
【解决方案2】:

这个怎么样?

jdList <- split(df, 1:nrow(df))

> class(jdList[[1]])
[1] "data.frame"

> system.time(jdList <- split(df, 1:nrow(df)))
   user  system elapsed 
   1.67    0.02    1.70 
> system.time(myList <- alply( df, 1, function(x) data.frame(x) ))
   user  system elapsed 
    7.2     0.0     7.3 

【讨论】:

    猜你喜欢
    • 2020-12-01
    • 2015-04-16
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2022-06-27
    • 1970-01-01
    相关资源
    最近更新 更多