Совпадение из разных наборов данных в R

В настоящее время у меня есть 3 CSV-файла, а именно df, mf, cf

df имеет один столбец с A, B, C, D, E, F

mf имеет две колонки с A, B, C в первом и US, India, China во втором столбце

cf имеет две колонки с D, E, F в первом и Uruguay, Argentina, Brazil во втором столбце

Ищите функцию типа vlookup, в которой я хочу искать данные из mf а также cf в файл df, Таким образом, функция должна сначала посмотреть в mf и подготовьте детали во втором столбце df тогда, если не найден, он должен перейти к cf для нахождения пропавшего в df... Обратите внимание, что вывод должен быть во втором столбце df

Выше приведен упрощенный пример... нужно искать из нескольких файлов, поэтому было бы полезно, если это можно сделать в R.

2 ответа

Решение

Использовать match Функция (как и @Gregor также предлагает) в два этапа с data.table, где вы подходите только для NA строки во второй раз:

library(data.table)
setDT(df)[, country := mf$y[match(x, mf$x)]
          ][is.na(country), country := cf$z[match(x, cf$x)]]

Используемые данные:

df <- data.frame(x = c("A", "B", "C", "D", "E", "F"))
mf <- data.frame(x = c("A", "B", "C"), y = c("US", "India", "China"))
cf <- data.frame(x = c("D", "E", "F"), z = c("Uruguay", "Argentina", "Brazil"))

Ее возможный подход:

df <- data.frame(Id=c('A','B','C','D','E','F','G'),stringsAsFactors=FALSE)
mf <- data.frame(Id=c('A','B','C'),Country=c('US', 'India', 'China'),stringsAsFactors=FALSE)
cf <- data.frame(Id=c('D','E','F'),Country=c('Uruguay', 'Argentina', 'Brazil'),stringsAsFactors=FALSE)
ef <- data.frame(Id=c('A','G'),Country=c('XXX', 'Italy'),stringsAsFactors=FALSE)

otherDFs <- list(mf,cf,ef)
df$Country <- NA # initialize df$Country column to NA
for(other in otherDFs){
  matchingIds <- match(df$Id,other$Id)
  matchingIds[!is.na(df$Country)] <- NA

  countries <- other$Country[matchingIds]
  df$Country <- ifelse(is.na(countries),df$Country,countries)
}

> df
  Id   Country
1  A        US
2  B     India
3  C     China
4  D   Uruguay
5  E Argentina
6  F    Brazil
7  G     Italy

Обратите внимание, что я добавил еще один data.frame ef который переопределяет A как XXX вместо US, Но с описанным подходом изначально соответствует значение A (т.е. US) не заменяется.

Другие вопросы по тегам