2017-04-25 1 views
4

Ich versuche, Daten aus zwei Formaten zu einem einzigen zu erzwingen, die ich leicht in as.Date eingeben kann. Hier ist ein Beispiel:Prozess Datum Regex Capturing Groups Ausgänge in R

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

ich das versucht habe:

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

Aber es gab mir dies:

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

aber ich will das!

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

Es sieht aus wie wenn ich month.abb == "\\1" verwenden, ist es nicht die Erfassungsgruppe Ausgabe ("Mar") verwenden, verwendet es nur den Anrufer Text ("\\1"). Ich möchte dies in Regex tun, wenn möglich. Ich weiß, du kannst es auf eine andere Art und Weise machen, aber du willst glatt sein.

Irgendwelche Ideen? Hier

+1

'as.Date' zwei Formate annehmen kann, dh' as.Date (df $ Datum, Format = c ('% b% d% Y% H:% M', '% m /% d /% Y')) '(ungetestet) – Sotos

+0

Ich möchte es mit Regex tun. Trotzdem danke. – Zafar

+1

Zur Erklärung: Regex sieht das Ergebnis des Ausdrucks paste0 - es sieht niemals die Werte, die in den Paste-Ausdruck eingehen. – epi99

Antwort

1

ist eine Möglichkeit, mit 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" 

Oder sub in Kombination mit gsubfn

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"