5

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

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"

我在这里找到了一个类似的问题,但答案(尤其是这个)并没有太大帮助。到目前为止,我已经尝试了grepfamily函数的几种变体,最接近有用的方法是运行strsplit(names, " ")分离名字,然后strsplit(names, " ")[[1]][1]只获取第一个人的名字。我一直在尝试调整最后一个命令,给我一个完整的名字向量,但无济于事。

4

4 回答 4

11

用于sapply提取名字:

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

一些评论:

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

于 2013-10-11T15:22:09.273 回答
5

For what you want, here's a pretty unorthodox way to do it:

read.table(text = names, header = FALSE, stringsAsFactors=FALSE, fill = TRUE)[[1]]
# [1] "Bernice"  "Dianna"   "Philip"   "Laurie"   "Rochelle" "Arturo"   "Enrique"  "Sarah"   
# [9] "Darryl"   "Arthur"  
于 2013-10-11T16:53:58.087 回答
3

这似乎有效:

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

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

于 2013-10-11T15:25:43.590 回答
3

使用正则表达式gsub

> gsub("^(.*?)\\s.*", "\\1", names)
 [1] "Bernice"  "Dianna"   "Philip"   "Laurie"   "Rochelle" "Arturo"   "Enrique"  "Sarah"   
 [9] "Darryl"   "Arthur"  
于 2013-10-11T15:26:48.143 回答