2013-10-11 67 views
5

名字说我有人民的名字一个载体,我的数据帧:提取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]以获得第一个人的名字。我一直在试图调整这最后的命令,给我一个完整的名字向量,无济于事。

回答

10

使用sapply提取的第一个名字:

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

一些评论:

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

3

这似乎工作:

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

假设没有第一/姓氏在他们的空间。

3

gsub

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

或'子( '*', '',名称)' – eddi

5

使用regexpr你想要的东西,这里是一个非常非正统的方式做到这一点:

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

不错!如果有人有第二个名字,我会建议设置'fill = T' :) – Michele

+0

@Michele,谢谢。我*曾打算这么做,但发帖时却忘了这么做。现在会更新。 – A5C1D2H2I1M1N2O1R2T1