一个用于 R data.table 的合并指示器?

5
我的问题与这个问题有关,但它是针对dplyr解决方案的。
我想做的是执行全外连接并创建一个指示器变量来说明合并结果,就像pandasSTATA一样。
具体来说,我希望在执行全外连接操作后有一个_merge列,该列指示左侧、右侧或两者合并结果,如下所示的例子。
更新:我已经更新了例子。
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

我想知道是否有现成的data.table功能可以帮助我完成这个任务,或者有没有简单的方法可以实现?


你的代码是用 python 编写的。你想要 R 解决方案还是 python? - akrun
也许是 df2[df1, on = .(key1)][, _merge := fcase(is.na(v2), 'left_only', 'both')] - akrun
使用fifelse功能,将两个数据框df1df2根据key1连接在一起,并创建一个名为_merge的列来表示v2列是否为空。如果是空值,则将其表示为“left_only”,否则表示为“both”。最终返回合并后的结果。 - akrun
据我所知,使用[进行连接只执行单侧。df2[df1, on=.(key1)]不会删除df2中未匹配的行吗? - Matthew Son
1个回答

5

你可以使用 all=TRUEmerge.data.table 进行全外连接:

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"]

输出:

   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

数据:

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)

正如Michael Chirico所提到的,在2020年7月24日发布的data.table_1.13.0版本中,可以使用以下方法来使用fcase

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

3
前提条件是在合并之前,我们必须选择!anyNAv1v2。可能还值得一提,在data.table的开发版本中有一个与fcase相关的解决方案。 - MichaelChirico
2
@MichaelChirico同意,因此我们将不得不在df1和df2中创建一些虚拟列x1和x2来处理v1和v2中可能存在的NA值。我无法从这里访问github.com,因此我只能基于CRAN发布。请随意添加解决方案,我很乐意删除。 - chinsoon12
@MichaelChirico 为什么需要通过.I生成r1/2?使用is.na(v1 or 2)不足以满足需求吗? - Misha
1
@Misha,原始数据可能包含缺失值(NAs)。 - chinsoon12

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接