【发布时间】:2016-04-18 19:57:15
【问题描述】:
我有两个非常大的 data.frame(每个都有 > 100,000 行),我正在尝试对其进行分析。它们太大而无法有效地运行我的代码,所以我正在寻找一种有效的方法将它们分成更小的集合。
示例数据框 1 和 2(作为 data.table 对象)
1)
Sample Chr Value Pop
1 1 100 X
1 2 200 X
2 1 100 X
2 2 200 X
2)
Sample Chr Value Pop
3 1 300 Y
3 2 200 Y
4 1 100 Y
4 2 400 Y
我想将两者结合起来并按Chr 列拆分它们。最终列表如下所示:
toydata
$`1`
Sample Chr Value Pop
1 1 100 X
2 1 100 X
3 1 300 Y
4 1 100 Y
$`2`
Sample Chr Value Pop
1 2 200 X
2 2 200 X
3 2 200 Y
4 2 400 Y
我目前的工作
到目前为止,我知道我可以通过以下方式组合 data.frames:
newdf <- rbind(df1, df2)
我可以使用split() 和data.table 拆分data.frames:
library(data.table)
newdf <- split(newdf, as.factor(newdf$Chr), drop=TRUE)
然后我可以运行任何下游分析:
lapply(newdf, somefunction)
但是,这对我的电脑来说太过分了。我认为如果我可以先拆分然后合并,可能会更好,但我也愿意接受其他时间和处理器友好的解决方案。
最坏的情况,我知道我可以将每个 Chr 子集到它自己的 data.frame 中,并对其中的每一个进行分析,但我想知道是否有更优雅的解决方案?
【问题讨论】:
-
split()来自base,而不是data.table。 -
@Stibu 在 data.table 中有另一个版本的 split(),我正在使用它(可能在开发人员版本中,因为这是我正在使用的版本)。 github.com/Rdatatable/data.table/blob/…
-
根据组合数据集与内存限制的接近程度,您可以尝试以下操作:绑定数据,保存到磁盘,关闭 R 和所有其他程序,打开 R,尝试拆分数据集.
-
@GaiusAugustus
split(newdf, by="Chr", drop=TRUE)这将更快地等效于您的问题的拆分呼叫。当然newdf必须是一个data.table 类才能被split.data.table方法拾取。
标签: r data.table