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



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

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

目标是组装一个包含名称的数据帧,格式如下:

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

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

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

这适用于包含姓氏、名字格式名称的行,但 gsub 将全部内容收集在名称为名字姓氏格式的行中。

因此,我的帮助请求是请告知:您将如何解决这个问题? 提前感谢大家!

这是一个单行。该模式首先尝试名字姓氏,如果失败,它会尝试姓氏,名字不使用任何包。

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

您可以将 ,版本重新排列为姓氏,然后只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

最新更新