#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
?