2013-04-09 56 views
36

空白字符串我的生日,看起來像這樣的列表:使用GSUB提取之前R中

dob <- c("9/9/43 12:00 AM/PM", "9/17/88 12:00 AM/PM", "11/21/48 12:00 AM/PM") 

我只想抓住從這個變量的日曆日期(即後放下一切第一次出現空白)。

這是我迄今爲止嘗試:

dob.abridged <- substring(dob,1,8) 
dob 
[1] "9/9/43 1" "9/17/88 " "11/21/48" 
dob.abridged <- gsub(" $","", dob.abridged, perl=T) 
> dob.abridged 
[1] "9/9/43 1" "9/17/88" "11/21/48" 

所以我的代碼適用於長度爲6或7的日曆日期,而不是長度8.更有效的正則表達式的任何指針與GSUB可使用處理長度爲6,7或8的日曆日期?

謝謝。

回答

85

無需substring,只需使用gsub

gsub(" .*$", "", dob) 
# [1] "9/9/43" "9/17/88" "11/21/48" 

的空間(),那麼任何字符(.)任意次數(*),直到字符串($)結束。學習正則表達式見?regex

+2

我可以在這裏分享的唯一建議是'sub'就夠了,因爲只有一個字符串結束位置。 – 2016-10-12 21:50:25

13

我經常用strsplit來解決這類問題,但是很喜歡羅曼的答案是多麼的簡單。我認爲羅曼的解決方案比作一個strsplit答案會很有意思:

這裏有一個strsplit解決方案:

sapply(strsplit(dob, "\\s+"), "[", 1) 

使用微基準測試包和dob <- rep(dob, 1000)與原始數據:

Unit: milliseconds 
            expr  min  lq median 
        gsub(" .*$", "", dob) 4.228843 4.247969 4.258232 
sapply(strsplit(dob, "\\\\s+"), "[", 1) 14.438241 14.558832 14.634638 
     uq  max neval 
    4.268029 5.081608 1000 
14.756628 53.344984 1000 

的Win 7機器上的明確贏家是來自Romain的gsub正則表達式。感謝羅曼的回答和解釋。

1

stringr包含一個適合此問題的函數。

library(stringr) 
word(dob,1) 
# [1] "9/9/43" "9/17/88" "11/21/48"