R data.table 的合并指示器?

Mat*_*Son 5 r data.table

我的问题与这个问题相关,但它要求dplyr解决方案。

我想做的是执行外连接并创建一个指示变量来解释合并结果,就像pandasorSTATA会做的那样。

具体来说,我希望_merge在完全外连接操作之后有一个列,指示与 left_only 或 right_only 或两者的合并结果,如下例所示。

更新:我已经更新了示例

key1 = c('a','b','c','d','e')
v1 = c(1,2,3, NA, 5)
key2 = c('a','b','d','f')
v2 = c(4,5,6,7)
df1 = data.frame(key=key1,v1)
df2 = data.frame(key=key2,v2)

> df1
   key v1
1:   a  1
2:   b  2
3:   c  3
4:   d NA
5:   e  5

> df2
   key v2
1:   a  4
2:   b  5
3:   d  6
4:   f  7

# merge result I'd like to have

   key v1 v2     _merge
1:   a  1  4       both
2:   b  2  5       both
3:   c  3 NA  left_only
4:   d NA  6       both # <- not right_only, both
5:   e  5 NA  left_only
6:   f NA  7 right_only
Run Code Online (Sandbox Code Playgroud)

我想知道我是否缺少现有data.table功能,或者是否有一种简单的方法来完成此任务?

chi*_*n12 5

您可以使用merge.data.tablewithall=TRUE来实现完整的外部联接:

library(data.table)
setDT(df1)
setDT(df2)
DT <- merge(df1[, r1 := .I], df2[, r2 := .I], by="key", all=TRUE)
DT[, merge_ := "both"][
    is.na(r1), merge_ := "right_only"][
        is.na(r2), merge_ := "left_only"]
Run Code Online (Sandbox Code Playgroud)

输出:

   key v1 r1 v2 r2     merge_
1:   a  1  1  4  1       both
2:   b  2  2  5  2       both
3:   c  3  3 NA NA  left_only
4:   d NA NA  6  3 right_only
Run Code Online (Sandbox Code Playgroud)

数据:

key1 = c('a','b','c')
v1 = c(1,2,3)
key2 = c('a','b','d')
v2 = c(4,5,6)
df1 = data.frame(key=key1,v1)
df2 = data.frame(key=key2,v2)
Run Code Online (Sandbox Code Playgroud)

正如 Michael Chirico 所提到的,data.table_1.13.02020 年 7 月 24 日发布的,还可以使用fcase如下:

DT[, merge_ := fcase(
    is.na(r1), "right_only",
    is.na(r2), "left_only",
    default = "both"
)]
Run Code Online (Sandbox Code Playgroud)

  • 附带条件是我们必须在合并之前选择“v1”和“v2”,即“!anyNA”。可能还值得一提的是与“data.table”的开发版本相关的“fcase”解决方案 (3认同)
  • @MichaelChirico 同意,所以我们必须在 df1 和 df2 中创建一些虚拟列 x1 和 x2 来处理 v1 和 v2 中可能的 NA。我无法从这里访问 github.com,因此我只能基于 CRAN 发帖。请随意添加解决方案,我很乐意删除 (2认同)