我有两个像这样的表,其中大多数 id 是共享的,但都包含另一个表中不存在的 id。年份(列)也重叠但有差异:
table1 <- data.table(id=c("a101","a102","a103","a104","a105"),
year1=c(0,10,12,414,23),
year2=c(4,23,34,45,23))
table2 <- data.table(id=c("a102","a103","a104","a105","a106"),
year2=c(23,34,45,23,0),
year3=c(14,2,14,12,15))
我想将它们外部加入,所以我最终得到一个像这样的表:
table3 <- data.table(id=c("a101","a102","a103","a104","a105","a106"),
year1=c(0,10,12,414,23,NA),
year2=c(4,23,34,45,23,0),
year3=c(NA,14,2,14,12,15))
这听起来很简单,但我的真实表格有很多年份列,而且我找不到不创建重复列的解决方案,例如year2.x、year2.y、year3.x、year3.y 等,并且不需要我写出代码中的所有列名称。
我当前的解决方案如下,但看起来非常复杂,而且可能内存效率不高。如果有允许通过引用连接的解决方案,那将是理想的选择,因为我正在使用的表非常大。但是,我意识到这对于外连接来说可能是不可能的。
# Full join the tables
table3 <- merge(table1, table2, by = "id", all = TRUE)
# Coalesce duplicate columns
for (col in intersect(names(table1), names(table2))) {
if (col != "id") {
table3[[col]] <- fcoalesce(table3[[paste0(col, ".x")]], table3[[paste0(col, ".y")]])
}
}
# Remove duplicate columns
table3 <- table3[, !grepl("\\.x|\\.y", names(table3)), with = FALSE]
一个(可能占用大量内存)选项:
table3b <- rbind(melt(table1, id.vars = "id"), melt(table2, id.vars = "id")) |>
unique() |>
dcast(id ~ variable)
identical(table3, setkey(table3b, NULL))
# [1] TRUE