【问题标题】:R - Merge/Join and only replace if missing (Priority?)R - 合并/加入并仅在丢失时替换(优先级?)
【发布时间】:2021-10-15 15:50:00
【问题描述】:

是否可以只合并缺失值的数据?

例如,假设我有两个数据集。 D1 是我的优先数据集,但我想使用 D2 中的信息来填充 D1 中的任何缺失数据。如果 D1 和 D2 有冲突的值,那么我想保留 D1 中的值并丢弃 D2。

D1 <- data.frame(
  id=seq(1,3),
  x=c("cow",NA,"sheep"))

D2 <- data.frame(
  id=seq(1,3),
  x=c("cow","turtle","parrot"))

理想情况下,最终数据集应如下所示:

D3 <- data.frame(
  id=seq(1,3),
  x=c("cow","turtle","sheep"))

turtle 将替换 NA,但 parrot 不会替换 sheep

【问题讨论】:

    标签: r join replace merge missing-data


    【解决方案1】:

    如果行是唯一标识的,您可以使用dplyr::rows_patch()

    library(dplyr)
      
    D1 %>%
      rows_patch(D2, by = "id")
    
      id      x
    1  1    cow
    2  2 turtle
    3  3  sheep
    

    【讨论】:

    • 我收到了一个未指明的错误:Error: Attempting to patch missing rows.。但是,match 函数起作用了。我认为当 Y 中的行(ID)多于 X 时,rows_patch() 会失败。我将提交错误报告。
    • 我刚刚看到函数“y 中的键值必须出现在 x 中”的以下文档。因此,基于 R 的match 是一个更好的解决方案,因为它没有相同的要求。
    【解决方案2】:

    在基础 R 中,您可以使用 match -

    inds <- is.na(D1$x)
    D1$x[inds] <- D2$x[match(D1$id[inds], D2$id)]
    D1
    
    #  id      x
    #1  1    cow
    #2  2 turtle
    #3  3  sheep
    

    【讨论】:

      猜你喜欢
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 2022-11-15
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 2017-04-14
      相关资源
      最近更新 更多