与allow.cartasian = TRUE合并会导致观察次数过多

时间:2016-03-14 13:50:08

标签: r memory merge data.table

我想合并2个数据框(data1data2)。两者最初都包含大约3500万个观测值(每个约2GB)。

我从data2删除了重复项。我需要将重复项保留在data 1中,因为我希望将它们用于data1中每次观察的进一步计算。

我最初得到了记录良好的错误:

  

检查i中的重复键值,每个键值一遍又一遍地加入x中的同一组。如果没关系,请尝试包含j并删除by(by-without-by),以便为每个组运行j以避免大量分配。如果您确定要继续,请重新运行allow.cartesian=TRUE。否则,请在FAQ,Wiki,Stack Overflow和datatable-help中搜索此错误消息以获取建议。

作为一个解决方案(我查看了几个主题,例如hereherehere),我包含了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)

非常欢迎任何有关如何合并的建议。

1 个答案:

答案 0 :(得分:1)

为了进行左连接,merge语句需要了解您正在使用哪个列作为&#34;键&#34;或&#34;索引&#34;为了加入。如果您有重复的列名称用作键/索引,它不知道该怎么做并给出该错误。此外,如果要连接的列与现有列具有相同的名称,则需要知道要执行的操作。

解决方案是临时重命名左侧(data1)数据集中的键/索引列一般来说,重复列名称是“坏”&#34;在R中,因为它会混淆很多功能。许多函数以静默方式调用make.unique()来删除列名,以避免混淆。

如果ID中有data1个重复列,请使用colnames(data1) <- make.unique(colnames(data1))进行更改,然后将其设置为ID.1ID.2等。然后执行合并(确保由于重命名而指定by.x="ID.1", by.y="ID"。默认情况下,合并的重复列将附加.y,但您可以使用suffixes=选项{{3指定后缀}}

最后,值得注意的是merge()包中的data.table函数往往比具有类似语法的基本merge()函数快得多。见(See Merge helpfile for details)