R:投射大数据帧

问题描述 投票:0回答:1

我遇到了一个相当大的数据框架问题,导致内存问题。或者,可能有更好的方法来做到这一点。我愿意接受任何一方的建议,以使其更好地运作。问题是这样的;

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个montecarlo模拟(5,000,000行数据)。

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

然而,编码在我的脚本中工作....没有错误或警告,我的更大的数据帧只需要很长时间。我试图避免在值上使用函数(sum,mean等),因为每个gridID~montecarlo只能有一个值,并且我认为由于计算,这也是一个很大的浪费时间。

然后将新投射的数据帧乘以相同格式的另一个数据帧,500,000行数据和1000列(每列代表蒙特卡罗迭代值),并经历一些更多的过程。

有关处理这些大型数据框架或加快速度的建议吗?

r casting reshape montecarlo
1个回答
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的内存分配。

profvis comparison

© www.soinside.com 2019 - 2024. All rights reserved.