R - 组合并拆分大型data.frames

时间:2016-04-18 19:57:16

标签: r data.table

我有两个非常大的data.frames(每个都有> 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中,然后对其中的每一个进行分析,但我想知道是否有更优雅的解决方案?

1 个答案:

答案 0 :(得分:2)

你需要惊人的 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