首页 > 解决方案 > 合并两个数据表,如果dt1有NA则从dt2取值

问题描述

我有两个数据表。我将它们合并到 4 个常用列中(主键 = col1)。但是,dt1 中的许多行在 3 个子键(col2、col3、col4)中都有 NA。合并时,它们保留 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

每当 dt1 具有 NA 时,如何调整合并以从 dt2 获取这 3 列(例如 col2、col3、col4)的值?

编辑:添加大小列,因为以前似乎没有必要将 DT 与给定值合并。

标签: rdataframejoinmergedata.table

解决方案


对于此示例数据集,可以使用coalesce包中的NAdplyr来解决问题。dt1如果您有更多列(您提到了 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

数据

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))

推荐阅读