下面我定义尺寸为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
答案 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