2017-04-25 40 views
4

我試圖將兩種格式的日期轉換爲一個單一的日期,我可以很容易地將日期轉換爲as.Date。這裏有一個例子:處理日期正則表達式捕獲組輸出R

library(dplyr) 
df <- data_frame(date = c("Mar 29 2017 9:30AM", "5/4/2016")) 

我已經試過這樣:

df %>% 
    mutate(date = gsub("([A-z]{3}) (\\d{2}) (\\d{4}).*", 
        paste0(which(month.abb == "\\1"),"/\\2","/\\3"), date)) 

但它給了我這樣的:

 date 
1 /29/2017 
2 5/4/2016 

但我想這個!

 date 
1 3/29/2017 
2 5/4/2016 

它看起來像當我使用month.abb == "\\1",它不使用捕獲組輸出("Mar"),它只是使用呼叫者文本("\\1")。如果可能的話,我想在正則表達式中這樣做。我知道你可以用另一種方式來做,但想要變得光滑。

任何想法?

+1

'as.Date'可以採取兩種形式,即'as.Date(DF $ date,format = c('%b%d%Y%H:%M','%m /%d /%Y'))'(未測試) – Sotos

+0

我想用正則表達式來做。謝謝您的好意。 – Zafar

+1

作爲解釋:正則表達式查看paste0表達式的結果 - 它從不會看到進入粘貼表達式的值。 – epi99

回答

1

這裏有一種方法用在組合gsubfn

library(gsubfn) 
df$date <- gsubfn("^([A-Za-z]{3})\\s+(\\d{2})\\s+(\\d{4}).*", function(x, y, z) 
        paste(match(x, month.abb),y, z, sep="/"), df$date) 
df$date 
#[1] "3/29/2017" "5/4/2016" 

或者subgsubfn

sub("(\\S+)\\s+(\\S+)\\s+(\\S+).*", "\\1/\\2/\\3", 
     gsubfn("^([A-z]{3})", setNames(as.list(1:12), month.abb), df$date)) 
#[1] "3/29/2017" "5/4/2016"