Другой вариант - использовать пакет data.table
.
Используя ту же настройку, что и @tmfmnk в своем ответе:
Построить пример набора данных:
df1 <- read.table(text = "ID Category
1 CatZZ
2 CatVV
3 CatAA
4 CatQQ", header = TRUE, stringsAsFactors = FALSE)
df2 <- read.table(text = "ID Category
1 Cat600
3 Cat611", header = TRUE, stringsAsFactors = FALSE)
Загрузить пакет data.table
и преобразовать кадры данных в таблицы данных:
library(data.table)
df1 <- data.table(df1)
df2 <- data.table(df2)
Выполнить объединение влево
(взять все значения из df1, где ID совпадает с df2, и добавить туда категорию из df2, а затем создать новый столбец, объединяющий информацию из df1 и df2)
a <- df2[df1, on = "ID"][, a := ifelse(is.na(Category), i.Category, Category)]
Есть хороший вопрос и ответв соединениях data.table здесь: Соединение влево с использованием data.table
Кроме того, чтобы получить именно тот результат, о котором вы просили, вы можете сделать:
a <- df2[df1, on = "ID"][, list(ID, Category = ifelse(is.na(Category), i.Category, Category))]