在R中提取名字

时间:2013-10-11 15:20:05

标签: regex r

假设我的数据框中有一个人名的向量:

names <- c("Bernice Ingram", "Dianna Dean", "Philip Williamson", "Laurie Abbott",
           "Rochelle Price", "Arturo Fisher", "Enrique Newton", "Sarah Mann",
           "Darryl Graham", "Arthur Hoffman")

我想创建一个带有名字的向量。我所知道的只是他们在上面的向量中首先出现,然后是一个空格。换句话说,这就是我在寻找的东西:

"Bernice" "Dianna"  "Philip" "Laurie" "Rochelle"
"Arturo"  "Enrique" "Sarah"  "Darryl" "Arthur"

我发现了一个类似的问题here,但答案(特别是this one)并没有多大帮助。到目前为止,我已经尝试了grep family中的一些功能变体,而我最接近的有用功能是通过运行strsplit(names, " ")来分隔名字,然后strsplit(names, " ")[[1]][1]来得到第一个人的名字。我一直试图调整这最后一个命令,给我一个完整的名字矢量,但无济于事。

4 个答案:

答案 0 :(得分:10)

使用sapply提取名字:

> sapply(strsplit(names, " "), `[`, 1)
 [1] "Bernice"  "Dianna"   "Philip"   "Laurie"   "Rochelle" "Arturo"   "Enrique" 
 [8] "Sarah"    "Darryl"   "Arthur"

一些意见:

以上工作正常。为了使其更加通用,您可以更改split strsplit函数中的" "参数"\\s+" gsub中涵盖多个空格。然后你也可以使用{{1}}直接提取空格前的所有内容。最后一种方法只使用一个函数调用,并且可能更快(但我没有检查基准)。

答案 1 :(得分:5)

对于你想要的东西,这是一种非常不正统的方式:

read.table(text = names, header = FALSE, stringsAsFactors=FALSE, fill = TRUE)[[1]]
# [1] "Bernice"  "Dianna"   "Philip"   "Laurie"   "Rochelle" "Arturo"   "Enrique"  "Sarah"   
# [9] "Darryl"   "Arthur"  

答案 2 :(得分:3)

这似乎有效:

unlist(strsplit(names,' '))[seq(1,2*length(names),2)]

假设没有名字/姓氏在其中有空格。

答案 3 :(得分:3)

gsub上使用regexpr

> gsub("^(.*?)\\s.*", "\\1", names)
 [1] "Bernice"  "Dianna"   "Philip"   "Laurie"   "Rochelle" "Arturo"   "Enrique"  "Sarah"   
 [9] "Darryl"   "Arthur"