R Сравнение двух фреймов данных без использования слияния

#r #dataframe

#r #фрейм данных

Вопрос:

Я хочу сравнить два фрейма данных с одинаковой структурой столбцов (с точки зрения количества столбцов и имен столбцов). Если значение в ячейке столбца A фрейма данных X совпадает со значением в ячейке столбца A фрейма данных Y, значения в ячейках (в той же строке) столбцов B и C фрейма данных X будут изменены на значения в ячейках столбцов B и C фрейма данных Y. Например,

Данные

 df_X <- structure(list(A = c("Apple", "Banana", "Orange", "Banana"), 
    B = c(1L, 2L, 3L, 2L), C = c(2L, 2L, 3L, 1L), D = c(2L, 2L, 
    3L, 5L)), class = "data.frame", row.names = c(NA, -4L))

df_Y <- structure(list(A = c("Apple", "Banana."), B = c(4L, 2L), C = c(3L, 
3L), D = c(2L, 4L)), class = "data.frame", row.names = c(NA, 
-2L))

Data Frame X
A          B  C  D
Apple      1  2  2
Banana     2  2  2
Orange     3  3  3
Banana     2  1  5

Data Frame Y
A         B  C  D
Apple     4  3  2
Banana.   2  3  4
  

После сопоставления фрейм данных x станет:

 Data Frame X
A          B  C  D
Apple      4  3  2
Banana     2  3  2
Orange     3  3  3
Banana     2  3  5
  

Я знаю, что объединение двух фреймов данных cab, вероятно, поможет. Но мне интересно, могу ли я выполнить задачу без использования merge / left_join() (в dplyr)? Потому что мой фрейм данных действительно длинный (много столбцов), и я хочу, чтобы в конце был независимый фрейм данных X. Спасибо!

Ответ №1:

Вы можете использовать match для перезаписи совпадающих строк из x с y .

 i <- match(x$A, y$A)
j <- !is.na(i)
x[j,c("B","C")] <- y[i[j],c("B","C")]
#       A B C D
#1  Apple 4 3 2
#2 Banana 2 3 2
#3 Orange 3 3 3
#4 Banana 2 3 5
  

Данные:

 x <- read.table(header=TRUE, text="
A          B  C  D
Apple      1  2  2
Banana     2  2  2
Orange     3  3  3
Banana     2  1  5")
y <- read.table(header=TRUE, text="
A         B  C  D
Apple     4  3  2
Banana    2  3  4")
  

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

1. Спасибо за ваш ответ! Однако, когда я пробую последнюю строку вашего кода, она показывает «Ошибка в *tmp* [[j]]: сбой рекурсивной индексации на уровне 2″. Вы знаете, почему это происходит?

2. У вас есть list ?