2016-03-05 74 views
0

我寫了下面的功能更改姓名爲第一最初在姓(R):函數不會遍歷向量中的所有對象?

names1 <- function(x) { 
      z <- unlist(strsplit(x, " "))[1] 
      z <- substr(z,1,1) 
      y <- unlist(strsplit(x, " "))[2] 
      paste(z,"."," ", y, sep="") 
      } 

所以

name <- "John Doe" 
names1(name) 

成功返回

"J. Doe" 

然而,當我嘗試將其應用於名稱向量時,它僅返回第一個對象(格式正確)。

爲什麼它不執行矢量中的所有對象的功能?我確實發現使用sapply它可以正常工作,但是我可以在矢量上運行其他類型的函數,而不需要sapply並將完整矢量作爲輸出返回。

+0

你使用'[1]'和'[2]'硬編碼了'unlist(strsplit(...))'的第一個和第二個元素。你必須改變你的功能,以獲得每一個姓和名,或者你可以保持它不被矢量化並使用弗蘭克答案中的建議。 – Molx

回答

0

tstrsplit從data.table封裝使這個有點簡單:

n = c("John Doe", "Abigail Ames") 

library(data.table) 
x = tstrsplit(n, " ") 
paste0(substr(x[[1]],1,1), ". ", x[[2]]) 
# [1] "J. Doe" "A. Ames" 

或者,在底座可以使用Vectorize你的功能,使向量化版本:

Vectorize(names1)(n) 
#  John Doe Abigail Ames 
#  "J. Doe" "A. Ames" 

或使用sapply將該功能應用於每個元素,然後組合結果

sapply(n, names1) 
#  John Doe Abigail Ames 
#  "J. Doe" "A. Ames" 
+1

謝謝!我遇到過很多環顧四周的data.table包,一旦我在底座上感覺足夠舒適,就會檢查它。 – moman822