2013-10-11 88 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