我有一组像
这样的字符data <- c("ABS Spring Meeting 5.14.15", "DEFG Sellors Tour 10.28.14", "DDCC Fun at the Museum 4.4.15", "GAME CS vs. Washington 11.01.14", "BSS Studio 54 5.13.15","Pas-12 3.5.15")
您可以注意到,最后一组数字是事件日期。我想将它们转换为日期
date <- c("2015-05-14","2014-10-28","2015-04-04","2014-11-01","2015-05-13","2015-03-05")
感觉我必须将这种子串起来(&#34; 5.14.15&#34;,&#34; 10.28.14&#34;,&#34; 4.4.15&#34;,&#34; 11.01模式的.14&#34;,&#34; 5.13.15&#34;,&#34; 3.5.15&#34;),然后进行日期转换。
任何人都可以帮我吗?谢谢!
答案 0 :(得分:5)
在基础R中,如果日期始终位于字符串的末尾,则可以使用
as.Date(sub(".*\\s", "", data), "%m.%d.%y")
# [1] "2015-05-14" "2014-10-28" "2015-04-04" "2014-11-01"
这里,正则表达式只是
.*
一切\\s
空格字符因此,这将删除所有内容,包括最终的空格字符。
答案 1 :(得分:3)
最快的方法是使用lubridate
。如果您提供一般格式,它会尝试为您解决:
library(lubridate)
mdy(data)
[1] "2015-05-14 UTC" "2014-10-28 UTC" "2015-04-04 UTC" "2014-11-01 UTC"
如果您的数据与其他数字变得更加复杂,您可以使用字符串提取方法。像这样:
mdy(sub(".*?([0-9.]+)$","\\1", data))
在模式".*?([0-9.]+)$"
:
.*?
匹配所有字符和空格。问号允许模式的下一部分完全匹配。
([0-9.]+)$
搜索到达由美元符号标记的字符串末尾的最长的数字和小数点。 parantheses在其中创建一组令牌。我们将使用该组进行下一步。
"\\1"
从模式中返回捕获组,并丢弃匹配的其余部分。
有许多网站会比我更能进一步进入正则表达式。由于它几乎用于所有编程语言,因此在您的研究中投入至少几个小时是非常值得的。
我在线学习了这本免费的Perl书。查看Ch。 5在这里:
https://www.perl.org/books/beginning-perl/
本网站有一个专注于R
的小节答案 2 :(得分:2)
data <- data <- c("ABS Spring Meeting 5.14.15",
"DEFG Sellors Tour 10.28.14", "DDCC Fun at the Museum 4.4.15",
"GAME CS vs. Washington 11.01.14", "BSS Studio 54 5.13.15",
"Pas-12 3.5.15")
library("lubridate")
library("stringr")
mdy(str_extract(data,"[0-9]+(\\.[0-9]+){2}$"))
## [1] "2015-05-14 UTC" "2014-10-28 UTC" "2015-04-04 UTC" "2014-11-01 UTC"
## [5] "2015-05-13 UTC" "2015-03-05 UTC"
正则表达式"[0-9]+(\\.[0-9]+){2}$"
表示&#34;多个数字([0-9]+
),后跟两个({2}
)个实例(一个点(\\.
))后跟一个以上的数字[0-9]+
),然后是字符串的结尾($
)&#34;