外连接data.tables,避免重复列

问题描述 投票:0回答:1

我有两个像这样的表,其中大多数 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]
r data.table outer-join
1个回答
0
投票

一个(可能占用大量内存)选项:

table3b <- rbind(melt(table1, id.vars = "id"), melt(table2, id.vars = "id")) |> 
  unique() |> 
  dcast(id ~ variable)


identical(table3, setkey(table3b, NULL))
# [1] TRUE
© www.soinside.com 2019 - 2024. All rights reserved.