转换R中的字符串

时间:2010-08-28 08:28:35

标签: r data-structures statistics

我必须合并到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中是否有办法使这两个变量可用作合并数据帧的标识符?

最好,托马斯

4 个答案:

答案 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