#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