【问题标题】:How does one do a full join using data.table?如何使用 data.table 进行完全连接?
【发布时间】:2013-02-16 17:19:47
【问题描述】:

data.table FAQ 中,nomatch = NA 参数被称为类似于外连接。但是,我无法让 data.table 进行 full 外连接 - 只有右外连接。

例如:

a <- data.table("dog" = c(8:12), "cat" = c(15:19))

   dog cat
1:   8  15
2:   9  16
3:  10  17
4:  11  18
5:  12  19

b <- data.table("dog" = 1:10, "bullfrog" = 11:20)

    dog bullfrog
 1:   1       11
 2:   2       12
 3:   3       13
 4:   4       14
 5:   5       15
 6:   6       16
 7:   7       17
 8:   8       18
 9:   9       19
10:  10       20

setkey(a, dog)
setkey(b, dog)

a[b, nomatch = NA]

    dog cat bullfrog
 1:   1  NA       11
 2:   2  NA       12
 3:   3  NA       13
 4:   4  NA       14
 5:   5  NA       15
 6:   6  NA       16
 7:   7  NA       17
 8:   8  15       18
 9:   9  16       19
10:  10  17       20

所以,nomatch = NA 产生一个右外连接(这是默认值)。如果我需要完全加入怎么办?例如:

merge(a, b, by = "dog", all = TRUE) 
# Or with plyr:
join(a, b, by = "dog", type = "full")

    dog cat bullfrog
 1:   1  NA       11
 2:   2  NA       12
 3:   3  NA       13
 4:   4  NA       14
 5:   5  NA       15
 6:   6  NA       16
 7:   7  NA       17
 8:   8  15       18
 9:   9  16       19
10:  10  17       20
11:  11  18       NA
12:  12  19       NA

data.table 可以吗?

【问题讨论】:

标签: r join data.table outer-join


【解决方案1】:

您实际上已经拥有它。使用merge.data.table,这正是你打电话时正在做的事情

merge(a, b, by = "dog", all = TRUE)

由于adata.tablemerge(a, b, ...) 调用merge.data.table(a, b, ...)

【讨论】:

  • 有什么方法可以使用A[B] 语法达到相同的结果?
【解决方案2】:
x= data.table(a=1:5,b=11:15)
y= data.table(a=c(1:4,6),c=c(101:104,106))

setkey(x,a)
setkey(y,a)

unique_keys <- unique(c(x[,a], y[,a]))
y[x[.(unique_keys), on="a"]  ] # Full Outer Join

【讨论】:

  • 太棒了!为了更容易理解,我想把最后两行分成三行:1)unique_keys &lt;- data.table(a = unique(c(x[,a], y[,a]))) 2)xx &lt;- x[unique_keys] 3)y[xx]
猜你喜欢
  • 2021-02-19
  • 2019-01-12
  • 1970-01-01
  • 2011-12-31
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
相关资源
最近更新 更多