2010-08-28 34 views
3

我必須合併到R中的數據幀。兩個數據幀共享一個公共id變量,即主題的名稱。但是,一個數據框中的名稱部分是大寫的,而另一個則是較小的名稱。此外,名稱以相反的順序出現。這裏是一個來自數據幀的示例:在R中轉換字符串

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有沒有辦法讓這兩個變量可用作合併數據幀的標識符?

最佳,托馬斯

回答

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語句應該是:

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") 
+0

對不起 - 我錯過了有關逆序排序的問題,您必須編寫一個自定義函數來將所有大寫文本移動到名稱的開頭,並將其小寫。 – Joel 2010-08-28 08:46:52

+0

謝謝喬爾,你有一個如何寫這樣的功能的想法? – 2010-08-28 08:54:36

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雖然。很多其他的東西也可能會咬你,比如兩個名字用空格隔開的人,或者是一個用標題列出的人!

巴里

+0

謝謝巴里,你說得對,這不是沒有問題的,我很可能不得不手動做一些東西,但希望這會減少工作量:) – 2010-08-28 12:13:42

0

除了使用GSUB重新排列名字的答案,你可能也想看看AGREP功能,此查找近似匹配。您可以使用此與sapply從一個數據幀尋找匹配的行其他,如:

> sapply(c('newyork', 'NEWJersey', 'Vormont'), agrep, x=state.name, ignore.case=TRUE) 
    newyork NEWJersey Vormont 
     32  30  45