我必须合并到R中的数据帧。两个数据帧共享一个共同的id变量,即主题的名称。但是,一个数据框中的名称部分是大写的,而另一个数据框中的名称是较小的。此外,名称以相反的顺序出现。以下是数据框中的示例:
DataFrame1$Name:
"Van Brempt Kathleen"
"Gräßle Ingeborg"
"Gauzès Jean-Paul"
"Winkler Iuliu"
DataFrame2$Name:
"Kathleen VAN BREMPT"
"Ingeborg GRÄSSLE"
"Jean-Paul GAUZÈS"
"Iuliu WINKLER"
R中是否有办法使这两个变量可用作合并数据帧的标识符?
最好,托马斯
答案 0 :(得分:3)
您可以使用gsub转换名称:
> names
[1] "Kathleen VAN BREMPT" "jean-paul GAULTIER"
> gsub("([^\\s]*)\\s(.*)","\\2 \\1",names,perl=TRUE)
[1] "VAN BREMPT Kathleen" "GAULTIER jean-paul"
>
这可以通过匹配第一个空格然后匹配任何内容,然后切换它们来工作。然后根据需要添加tolower()或toupper(),并使用match()连接数据框。
祝好Gralele与Grassle和Graßle相匹配。很多其他事情也可能会让你感到厌烦,比如有两个名字用空格隔开的人,或者有人用标题列出的人!
百里
答案 1 :(得分:2)
这是一个完整的解决方案,结合了迄今为止提供的两种部分方法(并克服了Spacedman关于“将Grassle与Graßle匹配”的担忧):
DataFrame2$revname <- gsub("([^\\s]*)\\s(.*)","\\2 \\1",DataFrame2$Name,perl=TRUE)
DataFrame2$agnum <-sapply(tolower(DataFrame2$revname), agrep, tolower(DataFrame1$Name) )
DataFrame1$num <-1:nrow(DataFrame1)
merge(DataFrame1, DataFrame2, by.x="num", by.y="agnum")
输出:
num Name.x Name.y revname
1 1 Van Brempt Kathleen Kathleen VAN BREMPT VAN BREMPT Kathleen
2 2 Gräßle Ingeborg Ingeborg GRÄSSLE GRÄSSLE Ingeborg
3 3 Gauzès Jean-Paul Jean-Paul GAUZÈS GAUZÈS Jean-Paul
4 4 Winkler Iuliu Iuliu WINKLER WINKLER Iuliu
如果DatFrame1的rownames仍然按顺序编号(默认为默认值),则不需要第三步。合并声明将是:
merge(DataFrame1, DataFrame2, by.x="row.names", by.y="agnum")
- 大卫。
答案 2 :(得分:0)
您是否可以为每个数据框添加一个额外的列/变量,这是原始名称的小写版本:
DataFrame1$NameLower <- tolower(DataFrame1$Name)
DataFrame2$NameLower <- tolower(DataFrame2$Name)
然后对此进行合并:
MergedDataFrame <- merge(DataFrame1, DataFrame2, by="NameLower")
答案 3 :(得分:0)
除了使用gsub重新排列名称的答案之外,您可能还想查看agrep函数,这会查找近似匹配项。您可以使用sapply来查找从一个数据框到另一个数据框的匹配行,例如:
> sapply( c('newyork', 'NEWJersey', 'Vormont'), agrep, x=state.name, ignore.case=TRUE )
newyork NEWJersey Vormont
32 30 45