【问题标题】:Add relative complement of two data.table with rbind使用 rbind 添加两个 data.table 的相对补集
【发布时间】:2019-02-06 12:40:39
【问题描述】:

我有一个键控 data.table,我想从另一个具有相同键的表中添加行:

library(data.table)
key.cols <- c("ID", "Code")
set.seed(1)
DT1 = data.table(
  ID = c("b","b","b","a","a","c"),
  Code = LETTERS[seq(1,6)],
  Number = runif(6)
);DT1

DT2 = data.table(
  ID = c("a","a","c","b","b","b"),
  Code = LETTERS[seq(4,9)],
  Number = runif(6)
);DT2

我只想将DT2 中未出现在DT1 中的键添加到DT1 行,即rbind 相对补码:

https://en.wikipedia.org/wiki/Complement_(set_theory)#Relative_complement

我可以尝试使用setops,然后添加键,让非键列填充NA,然后加入它们:

DT1 <- rbind(DT1, fsetdiff(DT2[,(key.cols), with=FALSE], DT1[,(key.cols), with=FALSE]), fill=TRUE)
DT1[DT2, Number:=ifelse(is.na(Number), i.Number, Number), on = key.cols];DT1

有没有更简单的方法?

【问题讨论】:

  • 过滤 DT2 和 rbind? rbind(DT1, DT2[ (!paste(ID, Code) %in% paste(DT1$ID, DT1$Code)), ])
  • 当然。但我必须弄清楚如何处理不同的列向量。使用粘贴可能会变得丑陋
  • 可能重复/相关帖子? stackoverflow.com/questions/1299871/…

标签: r data.table rbind


【解决方案1】:

稍微不那么麻烦的是:

rbind(DT1, DT2[!DT1, on = .(ID, Code)])
   ID Code     Number
1:  b    A 0.26550866
2:  b    B 0.37212390
3:  b    C 0.57285336
4:  a    D 0.90820779
5:  a    E 0.20168193
6:  c    F 0.89838968
7:  b    G 0.06178627
8:  b    H 0.20597457
9:  b    I 0.17655675

也许更容易处理的是使用unique()

unique(rbind(DT1, DT2), by = c("ID", "Code"))

【讨论】:

  • 是的。我相信 DT1 和 DT2 在第二个参数中颠倒了
  • 哦..是的。固定的 :)。反连接和 rbind。
  • 顺便说一句 @HannesZ 您可以将 on = .(ID, Code) 替换为 on = key_cols
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 2013-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-16
  • 1970-01-01
相关资源
最近更新 更多