Объединить 2 кадра данных с all.x = TRUE (кроме NA в x) в R - PullRequest
1 голос
/ 04 ноября 2019

У меня есть два больших кадра данных. Минимальный воспроизводимый пример их выглядит следующим образом:

A <- data.frame(A=c("a","b","c","d"), B=c(1,2,3,4), C=c(1,2,NA,NA), D=c(1,2,3,4))
A

  A B  C D
1 a 1  1 1
2 b 2  2 2
3 c 3 NA 3
4 d 4 NA 4

B <- data.frame(A=c("c","d"), B=c(3,4), C=c(3,4))
B

  A B C
1 c 3 3
2 d 4 4

Для каждой строки с NA в A у меня есть соответствующая строка в B с заменой отсутствующего значения. Я хотел бы объединить два фрейма данных A и B с «общим» фреймом данных AB таким образом, чтобы NA в фрейме данных A, столбец C были заменены их соответствующими значениями в фрейме данных B, столбец C. Результат должен выглядеть следующим образом:

AB <- data.frame(A=c("a","b","c","d"), B=c(1,2,3,4), C=c(1,2,3,4), D=c(1,2,3,4))
AB

  A B C D
1 a 1 1 1
2 b 2 2 2
3 c 3 3 3
4 d 4 4 4

«Самое близкое» (не так близко), которое я получил к решению, было со следующим кодом:

AB <- merge(A,B, all.x = TRUE)
AB

  A B  C D
1 a 1  1 1
2 b 2  2 2
3 c 3 NA 3
4 d 4 NA 4

, который, очевидно, просто использует переменные из A. Я уже рассмотрел следующие вопросы:

Учтите, что реальные кадры данных намного больше. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать. Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 04 ноября 2019

Используя пакет data.table, вы можете выполнить обновление-соединение, которое должно быстро выполняться для больших наборов данных.

library(data.table)
#set A and B as data.table
setDT(A);setDT(B)
#update col C in data.table A with col C from data.table B, join by cols A and B
A[ B, C := i.C, on = .( A, B) ]

output

#    A B C D
# 1: a 1 1 1
# 2: b 2 2 2
# 3: c 3 3 3
# 4: d 4 4 4
1 голос
/ 04 ноября 2019

Вы можете сделать что-то подобное в base:

index <- match(B$A, A$A) 

A$C[index] <- B$C

# A B C D
#1 a 1 1 1
#2 b 2 2 2
#3 c 3 3 3
#4 d 4 4 4
0 голосов
/ 04 ноября 2019

rbind(data.frame(na.omit(A)), B)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...