Индикатор слияния для R data.table? - PullRequest
0 голосов
/ 14 июля 2020

Мой вопрос связан с этим вопросом , но он задавал dplyr решение.

Я хотел бы выполнить внешнее соединение и создать индикаторную переменную, которая объясняет подойдет результат слияния, например pandas или STATA.

Чтобы указать c, я хотел бы иметь столбец _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

Мне интересно, не хватает ли мне существующей функции data.table или есть простая как выполнить эту задачу?

1 Ответ

1 голос
/ 14 июля 2020

Вы можете использовать merge.data.table с all=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"]

вывод:

   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)

Как упоминал Майкл Кирико, с data.table_1.13.0, выпущенным 24 июля 2020 г., можно также использовать fcase следующим образом:

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