假设我的数据框中有一个人名的向量:
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]
来得到第一个人的名字。我一直试图调整这最后一个命令,给我一个完整的名字矢量,但无济于事。
答案 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"