使用R解析混合格式的名称

时间:2017-08-30 14:35:14

标签: r regex text-mining

我有一个混合格式的名称列表,我想将它们分成包含R中名字和姓氏的列。示例数据集:

MAPI_NO_CACHE = &H0200
MAPI_BEST_ACCESS = &H0010
set OomFolder = Application.ActiveExplorer.CurrentFolder
set Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT
set RdoFolder = Session.GetFolderFromID(OomFolder.EntryID, , MAPI_NO_CACHE Or MAPI_BEST_ACCESS)
MsgBox "Number of items in the online folder: " & RdoFolder.Items.Count

目标是组装一个包含以下格式的名称的数据框:

Names <- c("Mary Smith","Hernandez, Maria","Bonds, Ed","Michael Jones")

我尝试了一些方法来根据名称是否仅用空格与逗号空格分隔来选择名字或姓氏。例如,我想在gsub中使用正则表达式从逗号空间分隔名称的行中复制名字:

FirstNames <- c("Mary","Maria","Ed","Michael")
LastNames <- c("Smith","Hernandez","Bonds","Jones")
FinalData <- data.frame (FirstNames, LastNames)

这适用于包含 LastName,FirstName 格式的名称的行,但gsub收集了名称为 FirstName LastName 格式的行中的所有内容。

所以我的求助请求请指教:你会如何解决这个问题?提前全部感谢!

3 个答案:

答案 0 :(得分:4)

这是一个单行。该模式首先尝试名字姓氏,如果失败则尝试姓氏,名字。没有包使用。

read.table(text = sub("(\\w+) (\\w+)|(\\w+), (\\w+)", "\\1\\4 \\2\\3", Names), as.is=TRUE)

,并提供:

       V1        V2
1    Mary     Smith
2   Maria Hernandez
3      Ed     Bonds
4 Michael     Jones

答案 1 :(得分:1)

您可以将版本重新排列为姓氏,然后重新排列strsplit

FirstNames <- sapply(strsplit(gsub('(\\w+), (\\w+)', '\\2 \\1', Names), ' '), `[[`, 1)
LastNames <- sapply(strsplit(gsub('(\\w+), (\\w+)', '\\2 \\1', Names), ' '), `[[`, 2)

答案 2 :(得分:0)

temp = strsplit(x = Names, split = "(, | )")
do.call(rbind, lapply(1:length(temp), function(i){
    if (grepl(pattern = ", ", x = Names[i])){
        data.frame(F = temp[[i]][2], L = temp[[i]][1])
    }else{
        data.frame(F = temp[[i]][1], L = temp[[i]][2])
    }
}))
#        F         L
#1    Mary     Smith
#2   Maria Hernandez
#3      Ed     Bonds
#4 Michael     Jones