从 R 中的不同数据集匹配
Match from different data sets in 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 中完成将很有帮助。
在 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"))
她的一个可能的方法:
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
)的初始匹配值不会被替换。
我目前有 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 中完成将很有帮助。
在 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"))
她的一个可能的方法:
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
)的初始匹配值不会被替换。