Преобразование символьных строк в R - PullRequest
3 голосов
/ 28 августа 2010

Я должен объединиться с фреймами данных в 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 сделать эти две переменные пригодными для использования в качестве идентификатора для объединения фреймов данных?

Best, Thomas

Ответы [ 4 ]

3 голосов
/ 28 августа 2010

Вы можете использовать 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 () для объединения ваших фреймов данных.

Удачи в том, что Грассл и Грасле соответствуют. Вероятно, вас будут кусать и другие вещи, например, люди с двумя именами, разделенными пробелом, или кто-то, у кого есть название!

Barry

2 голосов
/ 30 августа 2010

Вот полное решение, которое сочетает в себе два частичных метода, предложенных к настоящему моменту (и преодолевает опасения, высказанные 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 имел имена строк, которые все еще были последовательно пронумерованы (как они будут по умолчанию).Тогда оператор слияния будет:

merge(DataFrame1, DataFrame2, by.x="row.names", by.y="agnum")

- Дэвид.

0 голосов
/ 28 августа 2010

В дополнение к ответу, использующему gsub для перестановки имен, вы также можете посмотреть на функцию agrep, которая ищет приблизительные совпадения.Вы можете использовать это с sapply, чтобы найти подходящие строки из одного фрейма данных в другой, например:

> sapply( c('newyork', 'NEWJersey', 'Vormont'), agrep, x=state.name, ignore.case=TRUE )
  newyork NEWJersey   Vormont 
       32        30        45 
0 голосов
/ 28 августа 2010

Можете ли вы добавить дополнительный столбец / переменную к каждому фрейму данных, который является строчной версией исходного имени:

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

Затем выполните слияние с этим:

MergedDataFrame <- merge(DataFrame1, DataFrame2, by="NameLower")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...