R — Объединить/объединить и заменить только в случае отсутствия (Приоритет?)

#r #join #replace #merge #missing-data

Вопрос:

Возможно ли объединить данные только для отсутствующих значений?

Например, предположим, что у меня есть два набора данных. 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 бы .

Ответ №1:

Если строки однозначно идентифицированы, вы можете использовать dplyr::rows_patch() .

 library(dplyr)
  
D1 %>%
  rows_patch(D2, by = "id")

  id      x
1  1    cow
2  2 turtle
3  3  sheep
 

Комментарии:

1. Я получаю неопределенную ошибку с этим: Error: Attempting to patch missing rows. . Тем не менее, match функция работала. Я думаю, что rows_patch() это не удается, когда в Y больше строк (идентификаторов), чем X. Я собираюсь отправить отчет об ошибке.

2. Я только что видел следующую документацию по функции «ключевые значения в y должны встречаться в x». Таким образом, match из базы R является лучшим решением, потому что у него нет таких же требований.

Ответ №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