使用gsub在R中的空格之前提取字符串

Anu*_*ian 43 r

我有一个生日列表,看起来像这样:

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

我想从这个变量中获取日历日期(即在第一次出现空白后删除所有内容).

这是我到目前为止所尝试的:

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"
Run Code Online (Sandbox Code Playgroud)

因此,我的代码适用于长度为6或7但不长度为8的日历日期.有关使用gsub的更有效正则表达式的任何指针都可以处理长度为6,7或8的日历日期吗?

谢谢.

Rom*_*ois 104

不需要子串,只需使用gsub:

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

一个空格(), then any character (.数字()任意次数(*)直到字符串结束($).请参阅?regex来学习正则表达式.

  • 我可以在这里分享的唯一建议是`sub`就足够了,因为只有一个字符串结束位置. (2认同)

Tyl*_*ker 16

我经常使用strsplit这些问题,但喜欢罗曼的回答是多么简单.我认为将Romain的解决方案与strsplit答案进行比较会很有趣:

这是一个strsplit解决方案:

sapply(strsplit(dob, "\\s+"), "[", 1)
Run Code Online (Sandbox Code Playgroud)

使用microbenchmark软件包和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
Run Code Online (Sandbox Code Playgroud)

Win 7机器的明显赢家是gsubRomain 的正则表达式.感谢Romain的回答和解释.


小智 9

该库stringr包含针对此问题定制的函数.

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

  • 将第二个参数更改为 -1 会在最后一个空格之后提取文本,这正是我想要的。即```word(dob,-1)``` (4认同)