在R中转换字符字符串

3

我需要在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中将这两个变量用作合并数据框的标识符?最好,Thomas
4个回答

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() 来连接数据框。

祝你好运,不过将 Grassle 匹配到 Graßle 可能会有困难。还有其他很多问题可能会困扰你,例如名字由两个由空格分隔的名字组成,或者某人在名字前面有一个头衔!

Barry


谢谢Barry,你说得对,这并不是没有问题的,我很可能需要手动处理一些东西,但希望这能减轻一些工作负担 :) - Thomas Jensen

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

如果DataFrame1的行名称仍然按顺序编号(默认情况下会这样),则第三步是不必要的。合并语句将如下所示:
merge(DataFrame1, DataFrame2, by.x="row.names", by.y="agnum")

-- 大卫。

0

你能否为每个数据框添加一个额外的列/变量,该列/变量是原始名称的小写版本:

DataFrame1$NameLower <- tolower(DataFrame1$Name)
DataFrame2$NameLower <- tolower(DataFrame2$Name)

然后在此执行合并操作:

MergedDataFrame <- merge(DataFrame1, DataFrame2, by="NameLower")

抱歉 - 我错过了关于反向排序的部分,你需要编写一个自定义函数来将所有大写文本移动到名称的开头,并将其转换为小写。 - Joel
谢谢Joel,你有写这样一个函数的想法吗? - Thomas Jensen

0
除了使用gsub来重新排列名称的答案之外,您可能还想查看agrep函数,它可以寻找近似匹配。您可以使用sapply将其与另一个数据框中的匹配行相匹配,例如:
> sapply( c('newyork', 'NEWJersey', 'Vormont'), agrep, x=state.name, ignore.case=TRUE )
  newyork NEWJersey   Vormont 
       32        30        45 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接