下面我定义了一个维度为12x5的主数据集。我把它分成四个data.tables,然后我想把它们合并。在data.tables和一些列名称重叠之间没有行ID重叠。当我合并它们时,merge()不识别列名匹配,并为每个data.table中的每一列创建新列。最终合并的data.table应该是12x5,但结果是12x7。我认为data.table的merge()中的all=TRUE命令可以解决这个问题。
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发布于 2014-08-11 22:16:54
问题出在你使用“merge”函数的方式上。默认情况下,data.table包中的‘'merge’函数通过“它们之间的共享键列”来合并两个数据表。假设您创建的'a‘和'b’数据表如下:
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")其中'a‘将是这样的:
id C1
1: 1 1
2: 2 2
3: 3 3“b”将会是这样的:
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这是因为'merge‘函数只将'id’字段(数据表'a‘和’b‘之间的共享键)作为合并列,同时将所有非共享列添加到结果数据表中。现在,让我们尝试指定要合并的列:
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这同样适用于您调用的其他merge函数。所以试试这个:
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 5https://stackoverflow.com/questions/25244647
复制相似问题