使用 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
我有一个混合格式的姓名列表,我想将其分为包含 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