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

Parsing names in mixed formats using R

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

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

目标是 assemble 一个数据框,其中包含格式如下的名称:

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

我尝试了几种 select 名字或姓氏的方法,具体取决于姓名是否仅由 space 分隔,而不是逗号 -space。例如,我想在 gsub 中使用正则表达式从逗号-space 分隔名称的行中复制名字:

FirstNames2 <- gsub (".*,\s","",Names)

这适用于包含 LastName, FirstName 格式名称的行,但 gsub 收集名称为 FirstName LastName[=25] 的行中的全部内容=]格式。

所以我请求帮助是请指教:你会如何解决这个问题?在此先感谢大家!

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

FirstNames <- sapply(strsplit(gsub('(\w+), (\w+)', '\2 \1', Names), ' '), `[[`, 1)
LastNames <- sapply(strsplit(gsub('(\w+), (\w+)', '\2 \1', Names), ' '), `[[`, 2)
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

这是单行本。该模式首先尝试 Firstname lastname,如果失败,它会尝试 lastname, firstname。没有使用包。

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