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