熔化大型数据帧——reshape2 的熔化是否有实际大小限制?
Melting large dataframes--is there a practical size limit for reshape2's melt?
问题
我正在尝试将加载到具有大约 11k 变量和 2k 行的数据框中的调查数据集重塑为长(呃)格式,以便对循环问题产生的变量进行一些分析。我还没有找到解决内存分配错误的方法。
我是否达到了在数据帧上使用 melt 的实际大小限制(CSV 格式约为 28MB)?是否有不同的方法来使用 melt,或者您会为此目的使用不同的 function/library 吗?
到目前为止我尝试了什么
我试过使用 reshape2 的 melt 函数,它应该很简单,但会立即出现内存错误 ("cannot allocate vector of size...")。
然后我尝试将循环变量分解成块,以便让许多较小的数据帧融化然后重新构成。这给了我类似的错误(无法分配更小的尺寸)。
作为参考,我的数据有一个标识符字段("SbjNum"),一些只出现一次的变量(大约1900个),99个变量每个出现100次(前缀为"I_X_I_Y",其中 X 和 Y 标识循环)——并且应该熔化成对应于唯一 X 和 Y 的行。
天真地使用 melt 看起来像这样:
molten <- melt(data, id.vars = c("SbjNum"))
到目前为止我尝试过的分块看起来像这样:
#all variable names produced by the loops
loops <- names(data)[grep("I_\d{1,2}_I_\d{1,2}",names(data))]
#setting number of desired chunks
nloopvars <- length(loops)
nchunks <- 100
#make nchunks indexers to subset my data
chunks <- lapply(#indices of loops split into nchunks groups
split(1:nloopvars, sort(1:nloopvars%%nchunks)),
function(v){loops[v]}
)
#melt little subsets of the data
molten <- lapply(chunks,
function(x){
# take only identifier and a subset of loop vars
df <- data[c("SbjNum", x)]
# melt the loop vars
return(melt(df, id.vars = "SbjNum"))
}
)
编辑:在终止并重新启动 R 以及以多种不同方式清除我的工作空间后,方法 #2 现在可以使用了。
在终止并重新启动 R 并多次清除工作区后,我自己的 "chunking" 方法现在起作用了(参见问题)——我建议尝试此方法以防其他人遇到类似问题。
[还有一个问题是什么尺寸的熔化才有意义,但我现在可以在不知道答案的情况下生活。]
问题
我正在尝试将加载到具有大约 11k 变量和 2k 行的数据框中的调查数据集重塑为长(呃)格式,以便对循环问题产生的变量进行一些分析。我还没有找到解决内存分配错误的方法。
我是否达到了在数据帧上使用 melt 的实际大小限制(CSV 格式约为 28MB)?是否有不同的方法来使用 melt,或者您会为此目的使用不同的 function/library 吗?
到目前为止我尝试了什么
我试过使用 reshape2 的 melt 函数,它应该很简单,但会立即出现内存错误 ("cannot allocate vector of size...")。
然后我尝试将循环变量分解成块,以便让许多较小的数据帧融化然后重新构成。这给了我类似的错误(无法分配更小的尺寸)。
作为参考,我的数据有一个标识符字段("SbjNum"),一些只出现一次的变量(大约1900个),99个变量每个出现100次(前缀为"I_X_I_Y",其中 X 和 Y 标识循环)——并且应该熔化成对应于唯一 X 和 Y 的行。
天真地使用 melt 看起来像这样:
molten <- melt(data, id.vars = c("SbjNum"))
到目前为止我尝试过的分块看起来像这样:
#all variable names produced by the loops
loops <- names(data)[grep("I_\d{1,2}_I_\d{1,2}",names(data))]
#setting number of desired chunks
nloopvars <- length(loops)
nchunks <- 100
#make nchunks indexers to subset my data
chunks <- lapply(#indices of loops split into nchunks groups
split(1:nloopvars, sort(1:nloopvars%%nchunks)),
function(v){loops[v]}
)
#melt little subsets of the data
molten <- lapply(chunks,
function(x){
# take only identifier and a subset of loop vars
df <- data[c("SbjNum", x)]
# melt the loop vars
return(melt(df, id.vars = "SbjNum"))
}
)
编辑:在终止并重新启动 R 以及以多种不同方式清除我的工作空间后,方法 #2 现在可以使用了。
在终止并重新启动 R 并多次清除工作区后,我自己的 "chunking" 方法现在起作用了(参见问题)——我建议尝试此方法以防其他人遇到类似问题。
[还有一个问题是什么尺寸的熔化才有意义,但我现在可以在不知道答案的情况下生活。]