【问题标题】:R - Combine and split large data.framesR - 合并和拆分大型 data.frames
【发布时间】: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


【解决方案1】:

您想要令人惊叹的 data.table 包,但听起来您需要阅读一些内容才能使用它的全部功能,这对您来说意味着 by = 参数。 100,000 行对 data.table 来说不算什么。

选择子集既简单又快速。

require(data.table)
dt <- data.table(rbind(df1, df2))
dt
##    Sample Chr Value Pop
## 1:      1   1   100   X
## 2:      1   2   200   X
## 3:      2   1   100   X
## 4:      2   2   200   X
## 5:      3   1   300   Y
## 6:      3   2   200   Y
## 7:      4   1   100   Y
## 8:      4   2   400   Y

# extract a subset
dt[Chr == 1]
##    Sample Chr Value Pop
## 1:      1   1   100   X
## 2:      2   1   100   X
## 3:      3   1   300   Y
## 4:      4   1   100   Y

将函数应用于组同样简单,无需拆分。

# apply a function to a group
somefunction <- mean
dt[, somefunction(Value), by = Chr]
##    Chr  V1
## 1:   1 150
## 2:   2 250

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 2012-12-15
    相关资源
    最近更新 更多