2013-04-09 48 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"