Объедините две таблицы данных, возьмите значение из dt2, если dt1 имеет NA - PullRequest
0 голосов
/ 09 июля 2020

У меня есть две таблицы данных. Объединяю их в 4 общих столбца (Главный ключ = col1). Однако многие строки в dt1 имеют NA в 3 подключах (col2, col3, col4). При слиянии они сохраняют NA вместо того, чтобы брать существующее значение из строки в dt2, с которой они были сопоставлены.

Пример:

setkey(dt1, letter, number)
setkey(dt2, letter, number)
      dt1                     dt2
letter  number  size      letter  number  color
  a        10   big          a     10    blue
  b        NA   small        b     20    orange
  c        30   big          c     30    yellow
  d        40   big          d     40    red

dt_merged <- merge(dt1, dt2, all=TRUE)

      dt_merged
letter  number  size   color
     a     10   big    blue
     b     NA   small  orange
     c     30   big    yellow
     d     40   big    red

Как я могу настроить слияние для получения значений из dt2 для этих 3 столбцов (например, col2, col3, col4) всякий раз, когда dt1 имеет NA?

Изменить: добавлен столбец размера, поскольку ранее казалось ненужным объединять DT с заданными значениями.

Ответы [ 2 ]

0 голосов
/ 09 июля 2020

Вот вариант:

cols <- paste0("col", 2L:4L)
#look up the missing values from dt2 first before merging
dt1[is.na(col2), (cols) := dt2[.SD, on=.(col1), mget(paste0("x.", cols))]]
merge(dt1, dt2, all=TRUE)

вывод:

   col1 col2 col3 col4  size  color
1:    a   10   10   10   big   blue
2:    b   20   20   20 small orange
3:    c   30   30   30   big yellow
4:    d   40   40   40   big    red

данные:

dt1 <- data.table(col1 = c("a", "b", "c", "d"), 
    col2 = c(10L, NA, 30L, 40L), 
    col3 = c(10L, NA, 30L, 40L), 
    col4 = c(10L, NA, 30L, 40L), 
    size = c("big", "small", "big", "big"))

dt2 <- data.table(col1 = c("a", "b", "c", "d"), 
    col2 = c(10L, 20L, 30L, 40L), 
    col3 = c(10L, 20L, 30L, 40L), 
    col4 = c(10L, 20L, 30L, 40L), 
    color = c("blue", "orange", "yellow", "red"))
0 голосов
/ 09 июля 2020

Для этого образца набора данных можно использовать coalesce из пакета dplyr для решения проблем, когда dt1 имеет NA. Если у вас больше столбцов (вы упомянули col2, col3, col4), вам, вероятно, следует coalesce их все между двумя наборами данных с одинаковым обоснованием.

library(dplyr)

dt1 %>% 
  mutate(number = coalesce(number, dt2$number)) %>% 
  inner_join(dt2, by = c("letter", "number"))
#   letter number  size  color
# 1      a     10   big   blue
# 2      b     20 small orange
# 3      c     30   big yellow
# 4      d     40   big    red

Data

dt1 <- structure(list(letter = c("a", "b", "c", "d"), number = c(10L, 
NA, 30L, 40L), size = c("big", "small", "big", "big")), class = "data.frame", row.names = c(NA, -4L))

dt2 <- structure(list(letter = c("a", "b", "c", "d"), number = c(10L, 
20L, 30L, 40L), color = c("blue", "orange", "yellow", "red")), class = "data.frame", row.names = c(NA, -4L))
...