2017-02-02 6 views
1

Könnte mir jemand zeigen, wie man einen Tag mit einem Regex zu einem Datum hinzufügen?Hinzufügen von Tag zu Datum mit Regex

Hier ist mein Startcode:

#Create data frame 
a = c("01/2009","03/2006","","12/2003") 
b = c("03/2016","05/2010","07/2011","") 
df = data.frame(a,b) 

Hier ist, was ich erstellen mag:

#Create data frame 
a = c("01/01/2009","03/01/006","","12/01/2003") 
b = c("03/01/2016","05/01/2010","07/01/2011","") 
df = data.frame(a,b) 

ich so etwas wie dies versucht:

df$c <- gsub("(/.*)","\\01/\\1", df$a, perl=TRUE) 

Aber bin natürlich nicht immer Ergebnisse, die ich suche. Bin neu bei Regex und suche nach Hilfe. Vielen Dank.

+0

wie 'sub ("(\\ d +) \\/(\\ d +)", "\\ 1/01/\\ 2", C (" 01/2009 "," 03/2006 "," "," 12/2003 "))"? – nrussell

+1

Vielleicht 'gsub ("/","/01/", df $ a, fest = TRUE)'? Haben Sie immer leer oder 'dd/yyyy' oder gemischt mit' dd/MM/yyyy'? –

+0

Danke Jungs! Beide Lösungen funktionieren! Gsub funktioniert perfekt, ich versuche nur ein wenig mehr Regex zu lernen. Danke noch einmal! – DCRubyHound

Antwort

1

Sie brauchen keine Regex, wenn Sie nur Werte wie dd/yyyy oder leere haben. Verwenden Sie einfach eine Zeichenkette Ersatz:

gsub("/","/01/", df$a, fixed=TRUE) 

, die nur alle / Symbole mit /01/ String ersetzt.

Wenn Sie sicherstellen haben nur Sie Strings unter 2-digits/4-digits Muster fallen ändern, verwenden

gsub("^(\\d{2})/(\\d{4})$", "\\1/01/\\2", df$a) 

, wo das Muster passt:

  • ^ - Beginn der Zeichenfolge
  • (\\d{2}) - Erfassung Gruppe # 1 übereinstimmende 2 Ziffern
  • / - ein Literal /
  • (\\d{4}) - einfangende Gruppe # 2 gefundenen 4 Ziffern
  • $ - Ende der Schnur.

Die Ersetzungsmuster enthalten \\1, ein Rückverweis auf Gruppe 1 erfassten Wert, /01/ als Literal String und die \\2 Rückreferenzierung (das heißt der Wert erfaßt in Gruppe 2).

R demo:

> a = c("01/2009","03/2006","","12/2003") 
> b = c("03/2016","05/2010","07/2011","") 
> df = data.frame(a,b) 
> gsub("/","/01/", df$a, fixed=TRUE) 
[1] "01/01/2009" "03/01/2006" ""   "12/01/2003" 
> gsub("^(\\d{2})/(\\d{4})$", "\\1/01/\\2", df$a) 
[1] "01/01/2009" "03/01/2006" ""   "12/01/2003"