来自R

时间:2015-10-31 15:40:10

标签: r match lookup

我目前有3个csv文件,dfmfcf

df有一列A, B, C, D, E, F

mf有两列,第一列为A, B, C,第二列为US, India, China

cf有两列,第一列为D, E, F,第二列为Uruguay, Argentina, Brazil

正在寻找一个vlookup类型函数,其中我想将mfcf中的数据查找到文件df中。因此,该函数应首先查看mf并在df的第二列中绘制详细信息,如果未找到,则应移至cf以查找df中缺少的结果。请注意输出应该在df

的第二列

以上是一个简化示例...必须从多个文件中查找,因此如果可以在R中完成,将会很有帮助。

2 个答案:

答案 0 :(得分:0)

使用 data.table 分别在两个步骤中使用match函数(如@Gregor建议的那样),其中第二次只匹配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"))

答案 1 :(得分:0)

她是一种可行的方法:

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)的初始匹配值不会被替换。