我想合并2个数据框(data1
和data2
)。两者最初都包含大约3500万个观测值(每个约2GB)。
我从data2
删除了重复项。我需要将重复项保留在data 1
中,因为我希望将它们用于data1
中每次观察的进一步计算。
我最初得到了记录良好的错误:
检查
i
中的重复键值,每个键值一遍又一遍地加入x
中的同一组。如果没关系,请尝试包含j
并删除by
(by-without-by),以便为每个组运行j
以避免大量分配。如果您确定要继续,请重新运行allow.cartesian=TRUE
。否则,请在FAQ,Wiki,Stack Overflow和datatable-help中搜索此错误消息以获取建议。
作为一个解决方案(我查看了几个主题,例如here,here和here),我包含了allow.cartesian=TRUE
,但现在我遇到了内存问题。此外,对于它工作的子集,但它给了我更多的观察结果(data1
现在有5000万个观测值,尽管指定了all.x=TRUE
)。
我的代码是:
#Remove duplicates before merge
data2 <- unique(data2)
#Merge
require(data.table)
data1 <- merge(data1, data2, by="ID", all.x=TRUE, allow.cartesian=TRUE)
非常欢迎任何有关如何合并的建议。
答案 0 :(得分:1)
为了进行左连接,merge语句需要了解您正在使用哪个列作为&#34;键&#34;或&#34;索引&#34;为了加入。如果您有重复的列名称用作键/索引,它不知道该怎么做并给出该错误。此外,如果要连接的列与现有列具有相同的名称,则需要知道要执行的操作。
解决方案是临时重命名左侧(data1)数据集中的键/索引列一般来说,重复列名称是“坏”&#34;在R中,因为它会混淆很多功能。许多函数以静默方式调用make.unique()
来删除列名,以避免混淆。
如果ID
中有data1
个重复列,请使用colnames(data1) <- make.unique(colnames(data1))
进行更改,然后将其设置为ID.1
,ID.2
等。然后执行合并(确保由于重命名而指定by.x="ID.1", by.y="ID"
。默认情况下,合并的重复列将附加.y
,但您可以使用suffixes=
选项{{3指定后缀}}
最后,值得注意的是merge()
包中的data.table
函数往往比具有类似语法的基本merge()
函数快得多。见(See Merge helpfile for details)