【问题标题】:R: casting large data framesR:铸造大数据帧
【发布时间】:2018-06-10 02:15:11
【问题描述】:

我在投射相当大的数据帧时遇到问题,遇到内存问题。或者,可能有更好的方法来做到这一点。我愿意接受任何方面的建议,以使其更好地工作。问题是这样的;

library(reshape)
dataf <- data.frame( gridID = rep(c(1,2,3,4),4000), montecarlo = rep(1:1000,each=4), number=runif(1600,0,1) )
castData <- cast(dataf, gridID ~ montecarlo, value='number')

对于我的一些数据集来说,这需要非常长的时间。假设一个数据框有 500,000 个唯一的 gridID 值,每个值有 1000 个蒙特卡罗模拟(5,000,000 行数据)。

我在写这个问题时遇到了这个错误: 聚合需要 fun.aggregate:默认使用长度

但是,编码在我的脚本中正常工作....没有错误或警告,我的较大数据帧只需要很长时间。我试图避免在值上使用函数(总和、平均值等),因为每个 gridID ~ montecarlo 只能有一个值,我认为由于计算,这也浪费了大量时间。

然后将新铸造的数据框与另一个相同格式的数据框相乘,500,000 行 1000 列的数据(每列代表蒙特卡罗迭代值),并经过更多处理。

对于处理这些大型数据帧或加快处理速度有什么建议吗?

【问题讨论】:

  • 查看 data.table 库,它可以很好地处理大型集合,并且重塑工具 melt/ dcast 是内置方法。见this SO post

标签: r casting reshape montecarlo


【解决方案1】:

如前所述,使用data.table 包将大有帮助。下面的代码为四个网格中的每一个生成两个运行 100,000 次的数据帧,然后使用 reshape::cast()data.table::dcast() 将它们转换为宽格式。

library(reshape)
library(data.table)

## Define a number of simulations
N_Sims <- 100000L

## Create a data frame
dataf <- data.frame(gridID = rep(c(1,2,3,4),N_Sims),
                    montecarlo = rep(1:N_Sims,each=4),
                    number=runif(N_Sims*4L,0,1) )

## Cast using reshape::cast()
castData <- reshape::cast(dataf, gridID ~ montecarlo, value='number')

## Create a fresh data frame to use with data.table
DT_dataf <- data.frame(gridID = rep(c(1,2,3,4),N_Sims),
                       montecarlo = rep(1:N_Sims,each=4),
                       number=runif(N_Sims*4L,0,1) )

## Convert to data.table by reference
setDT(DT_dataf)

## Cast using data.table::dcast()
DT_castData <- data.table::dcast(DT_dataf, gridID ~ montecarlo, value.var = 'number')

profvis 结果:

使用 profvis 运行上面的代码表明,使用 data.table::dcast() 所花费的时间是 reshape::cast() 所用时间的一小部分,并且需要大约 1/10 的内存分配。

【讨论】:

    猜你喜欢
    • 2016-07-11
    • 2019-02-08
    • 2014-02-25
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多