【发布时间】:2021-11-11 18:41:59
【问题描述】:
我需要合并 2 个巨大的数据集 (left_join)。每个数据集有 15mio 行。
我尝试了不同的方法来合并它们,但总是有错误消息:
例如,数据集 X 有变量 NAME 和 value_Q1,数据集 Y 有变量 NAME 和 value_Q2。
Try1 <- left_join(X, Y)
- 错误:无法分配大小为 19251.5 Gb 的向量
Try2 <- merge(X, Y, by = "NAME", all.x =TRUE)
- 错误:不允许负长度向量
Try3_1 <- merge(X[1:10000000,], Y, by = "NAME", all.x =TRUE)
-工作
Try3_2 <- merge(X[10000001:nrow(X),], Y, by = "NAME", all.x =TRUE)
- 错误:不允许负长度向量
Try3_2 的结果最让我吃惊,因为 Try3_1 可以处理 10mio 行,但 Try3_2 不能只处理 5mio 行。 R 中的merge 是如何工作的?
最后,我还用数据表尝试了上面的代码,错误消息说结果超过 2^31 行。
【问题讨论】:
-
从 15mio 行到 2^31 行听起来像是得到了类似笛卡尔的连接,这对于
base::merge、dplyr::*_join或data.table-merges 来说非常困难。Try3_1产生了多少行?您是否省略了要加入的键? -
顺便说一句,你有
X(大写)但你正在做:nrow(x)(小写)。也许这会导致问题? -
非常相关,可能是重复的:stackoverflow.com/q/42479854/3358272。检查
sum(duplicated(X[,c("NAME")])(和Y)以查看您是否/有多少重复行。 -
在 Try3_1 中,结果中有 10mio 行。我只需要 Y 中与 X 匹配的值,因此发生了左连接。
-
2. nrow(x) 在我的问题中是一个打字错误,在我的程序中我是正确的。 3. X 和 Y 都没有重复。
标签: r