2015-09-23 99 views
0

提取與點串的模式我有一組人物像從字符串中的R

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") 

覺得我有串這種(「15年5月14日」,「14年10月28日」,「4.4.15」,「14年1月11日」,「5.13。 15「,」3.5.15「)的模式,然後做日期轉換。

任何人都可以幫助我嗎?謝謝!

+0

其他人物如「BSS Studio 54 5.13.15」,「Pas-12 3.5.15」 –

回答

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.]+)$搜索最長的一串數字和小數點,到達由美元符號標記的字符串的末尾。禁忌在它內部創建了一組令牌。我們將使用該組進行下一步。

  • "\\1"從模式中返回捕獲組並丟棄餘下的匹配。

有很多網站會進一步進入正則表達式超過我可以。由於它幾乎用於每種編程語言,因此在其研究中投入至少幾個小時將是非常值得花時間的。

我在線學習了這本免費的Perl書。退房Ch。5這裏:

https://www.perl.org/books/beginning-perl/

這個網站有一個子部分聚焦R上

http://www.regular-expressions.info/rlanguage.html

+3

這很酷,有點警惕,''mdy()'只是忽略了所有無關的措辭... –

+0

只能部分工作爲我的數據庫。我的整個表格包含約300個名稱,名稱中包含一些其他數字,例如「BSS Studio 54 5.13.15」,那麼它不適用於此。 –

+0

添加了提取方法。 –

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}$"表示「一個以上的數字([0-9]+),接着兩個({2})實例(一個點(\\.)後跟一個以上的數字[0-9]+),隨後結束字符串($)」

+0

非常感謝,但您能否解釋「[0-9] +(\\。[0-9] +){2} $」一點點, 我正在學。 –

5

在基R,以及設置在日期總是在字符串的末尾時,可以使用

as.Date(sub(".*\\s", "", data), "%m.%d.%y") 
# [1] "2015-05-14" "2014-10-28" "2015-04-04" "2014-11-01" 

在此,正則表達式僅僅是

  • .*一切
  • \\s空格字符

因此,這將刪除所有內容,包括最終的空格字符。