【问题标题】:Converting a large list into a data.frame将大列表转换为 data.frame
【发布时间】:2013-08-18 21:04:45
【问题描述】:

我正在尝试将一个包含 13,000 个元素的列表(每个元素是一个 nr = 230 和 ncol = 4 的 zoo 对象)转换为一个数据帧。

我已经尝试过setattr(mylist, 'class', 'data.frame'),但它导致了一个巨大的 NA 向量。 我也尝试过plyr 包中的quickdf(mylist) 函数,但也没有用。

do.call(rbind.data.frame, mylist)type 方法非常慢,因此在这种情况下不是一个选项。

关于将此类列表转换为数据框的最有效方法有什么建议吗?

【问题讨论】:

  • 请不要在标题中添加多余的标签名称。
  • 哪个标签是多余的?
  • r 标签(在标题中)。
  • 很抱歉,我是这个论坛的新手,仍然习惯于“规则”。请多多包涵..

标签: r performance memory-management dataframe


【解决方案1】:

我不确定这是否有效,但你可以尝试

library(plyr)
ldply(mylist)

【讨论】:

  • 正如我在问题中指定的那样,docall.rbind(mylist) 不是一个选项,因为从内存管理的角度来看它效率不高,并且会导致大量运行时间。我还没有尝试过ldply(mylist).. 会试试的,谢谢!
  • 我已经删除了那个。
  • 谢谢!我目前正在尝试ldply(mylist),它非常慢。如果不是过多的话,我会让它运行并报告运行时。我仍然相信在这种情况下必须有一种更有效的方法..
  • 嗯,它给出了以下错误:Error in matrix(NA, nrow = nrows, ncol = length(cols)) : too many elements specified
  • 我将它分成 5 份,但仍然出现该错误...我不确定这是否是因为列表中的每个元素本身都是具有 4 列的动物园对象
【解决方案2】:

使用 data.table 包中的 rbindlist。

data <- matrix(data = 1, nrow = 230, ncol = 4)
lstData <- rep(list(data), 16000)

library(data.table)
lstData <- Map(as.data.frame, lstData)
dfrData <- rbindlist(lstData)


system.time(dfrData <- rbindlist(lstData))
user  system elapsed 
0.12    0.03    0.15 

【讨论】:

  • 效果很好!结果是data.table,然后我简单地将其转换为data.frame!谢谢!!
  • 1.对于时间序列,我会使用 xts。它基本上是动物园,但针对速度进行了优化。 2. 你可以为日期本身做 rbindlist 。 lstIndex &lt;- Map(as.data.frame, Map(index, lstData)) dfrIndex &lt;- rbindlist(lstIndex) setnames(dfrIndex, "Date") lstData &lt;- Map(as.data.frame, lstData) dfrData &lt;- rbindlist(lstData) zooResult &lt;- as.zoo(dfrData, as.Date(dfrIndex$Date))
  • 你解决了我的问题。非常感谢!我会赞成你的回答,我只是没有足够的声誉:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 2011-09-12
相关资源
最近更新 更多