gpt4 book ai didi

r - R:将数据框的每一行转换为一个列表项

转载 作者:行者123 更新时间:2023-12-03 13:30:36 28 4
gpt4 key购买 nike

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

最佳答案

只需使用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
>


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

更新:
如果您可以将data.frame转换为矩阵,则以下解决方案将非常快速。您也许可以使用 adply,但是它将删除名称并在每个列表元素中返回一个向量。

> 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 - R:将数据框的每一行转换为一个列表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5110732/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com