从 R 中的名称向量中提取姓氏
Extracting last-names from a vector of names in R
我有一个包含 U.S 的数据框。参议员姓名,我只需要提取姓氏,这样我就可以将它们与另一个包含参议员其他信息的数据框(以及仅包含姓氏的列)进行模糊匹配。
问题是这些名字有时包含中间名的首字母或中间名,并在末尾有参议员的政党。我如何编写一个 gsub 命令来提取参议员的姓氏?抱歉,我是正则表达式的新手,而且真的很不擅长。
这里的数据片段:
names <- c("John Kerry (D)", "John H Chafee (R)", "Chris Dodd (D)", "Joe Lieberman (D)", "Frank R Lautenberg (D)", "Daniel Patrick Moynihan (D)", "Alfonse M D'Amato (R)", "Arlen Specter (R)", "Jay Rockefeller (D)", "Carl Levin (D)")
您可以在结果列表中使用 strsplit()
和 lapply()
:
> unlist(lapply(strsplit(names, " "), function(x) { return(x[length(x)-1]) }))
[1] "Kerry" "Chafee" "Dodd" "Lieberman" "Lautenberg"
[6] "Moynihan" "D'Amato" "Specter" "Rockefeller" "Levin"
这里的技巧是取每个拆分字符串中的倒数第二个元素,即姓氏。
这将为您解析出名称。
library(stringi)
library(rex)
library(dplyr)
library(tidyr)
name_split = rex(capture(any_graphs),
" ",
maybe(capture(any_graphs),
" "),
capture(any_graphs),
" ",
"(", capture(upper), ")")
data_frame(string = names) %>%
extract(string, c("first", "middle", "last", "party"), name_split) %>%
filter(first %>% is.na %>% `!`)
一个选项 stringi
library(stringi)
stri_extract(names, regex="\w+(?=\s+\()")
#[1] "Kerry" "Chafee" "Dodd" "Lieberman" "Lautenberg"
#[6] "Moynihan" "Amato" "Specter" "Rockefeller" "Levin"
我有一个包含 U.S 的数据框。参议员姓名,我只需要提取姓氏,这样我就可以将它们与另一个包含参议员其他信息的数据框(以及仅包含姓氏的列)进行模糊匹配。
问题是这些名字有时包含中间名的首字母或中间名,并在末尾有参议员的政党。我如何编写一个 gsub 命令来提取参议员的姓氏?抱歉,我是正则表达式的新手,而且真的很不擅长。
这里的数据片段:
names <- c("John Kerry (D)", "John H Chafee (R)", "Chris Dodd (D)", "Joe Lieberman (D)", "Frank R Lautenberg (D)", "Daniel Patrick Moynihan (D)", "Alfonse M D'Amato (R)", "Arlen Specter (R)", "Jay Rockefeller (D)", "Carl Levin (D)")
您可以在结果列表中使用 strsplit()
和 lapply()
:
> unlist(lapply(strsplit(names, " "), function(x) { return(x[length(x)-1]) }))
[1] "Kerry" "Chafee" "Dodd" "Lieberman" "Lautenberg"
[6] "Moynihan" "D'Amato" "Specter" "Rockefeller" "Levin"
这里的技巧是取每个拆分字符串中的倒数第二个元素,即姓氏。
这将为您解析出名称。
library(stringi)
library(rex)
library(dplyr)
library(tidyr)
name_split = rex(capture(any_graphs),
" ",
maybe(capture(any_graphs),
" "),
capture(any_graphs),
" ",
"(", capture(upper), ")")
data_frame(string = names) %>%
extract(string, c("first", "middle", "last", "party"), name_split) %>%
filter(first %>% is.na %>% `!`)
一个选项 stringi
library(stringi)
stri_extract(names, regex="\w+(?=\s+\()")
#[1] "Kerry" "Chafee" "Dodd" "Lieberman" "Lautenberg"
#[6] "Moynihan" "Amato" "Specter" "Rockefeller" "Levin"