我遇到了投放相当大的数据框架的问题,这会导致内存问题。或者,可能有更好的方法来做到这一点。我愿意接受任何一方的建议,以使其更好地运作。问题是这样的;
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列(每个代表蒙特卡罗迭代值),并进行更多处理。
有关处理这些大型数据框架或加快速度的建议吗?
答案 0 :(得分: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运行上面的代码表明使用data.table::dcast()
只花费reshape::cast()
所用时间的一小部分,并且需要大约1/10的内存分配。