data.table merge产生额外的列[R]

时间:2014-08-11 13:38:09

标签: r merge data.table

下面我定义尺寸为12x5的主数据集。我把它分成四个data.tables,我想合并它们。 data.tables和某些列名重叠之间没有行ID重叠。当我合并它们时,merge()无法识别列名称匹配,并为每个data.table中的每个列创建新列。最终合并的data.table应为12x5,但它的结果为12x7。我认为data.table' all=TRUE中的merge()命令可以解决这个问题。

library(data.table)

a <- data.table(id = c(1, 2, 3),  C1 = c(1, 2, 3))
b <- data.table(id = c(4, 5, 6),  C1 = c(1, 2, 3),  C2 = c(2, 3, 4))
c <- data.table(id = c(7, 8, 9),  C3 = c(5, 2, 7))
d <- data.table(id = c(10, 11, 12),  C3 = c(8, 2, 3), C4 = c(4, 6, 8))

setkey(a, "id")
setkey(b, "id")
setkey(c, "id")
setkey(d, "id")

final <- merge(a, b,  all = TRUE)
final <- merge(final, c,  all = TRUE)
final <- merge(final, d,  all = TRUE)

names(final)
dim(final)  #outputs correct numb of rows, but too many columns

1 个答案:

答案 0 :(得分:4)

问题在于你使用&#39;合并的方式。功能。 &#39;合并&#39;默认情况下,data.table包中的函数通过它们之间的&#34;共享键列合并两个数据表&#34;。假设你创建了一个&#39;和&#39; b&#39;像这样的数据表:

library(data.table)
a <- data.table(id = c(1, 2, 3),  C1 = c(1, 2, 3))
b <- data.table(id = c(4, 5, 6),  C1 = c(1, 2, 3),  C2 = c(2, 3, 4))
setkey(a, "id")
setkey(b, "id")

其中&#39; a&#39;会是这样的:

   id C1
1:  1  1
2:  2  2
3:  3  3

和&#39; b&#39;会是这样的:

   id C1 C2
1:  4  1  2
2:  5  2  3
3:  6  3  4

现在,让我们先试试你的代码:

merge(a, b,  all = TRUE)

结果如下:

   id C1.x C1.y C2
1:  1    1   NA NA
2:  2    2   NA NA
3:  3    3   NA NA
4:  4   NA    1  2
5:  5   NA    2  3
6:  6   NA    3  4

这是因为&#39;合并&#39;功能只是&#39; id&#39;字段(数据表之间的共享密钥&#39; a&#39;&#39;&#39;)作为合并列,同时将所有非共享列添加到结果数据表中。现在让我们尝试指定要合并的列:

merge(a, b, by=c("id","C1"), all = TRUE)

现在结果将是:

   id C1 C2
1:  1  1 NA
2:  2  2 NA
3:  3  3 NA
4:  4  1  2
5:  5  2  3
6:  6  3  4

同样适用于您调用的其他合并函数。所以试试这个:

final <- merge(a, b, by=c("id","C1"), all = TRUE)
final <- merge(final, c, by="id", all = TRUE)  #here you don't necessarily need to specify by...
final <- merge( final, d, by=c("id","C3"),all=TRUE)

dim(final)
[1] 12  5