2016-06-09 10 views
1

Ich versuche das folgende zu konvertieren und bin nicht erfolgreich mit einem der Daten [1]. "4/2/10" wird zu "0010-04-02".Lubridate mdy Funktion

Gibt es eine Möglichkeit, dies zu korrigieren?

Dank, Vivek

data <- data.frame(initialDiagnose = c("4/2/10","14.01.2009", "9/22/2005", 
     "4/21/2010", "28.01.2010", "09.01.2009", "3/28/2005", 
     "04.01.2005", "04.01.2005", "Created on 9/17/2010", "03 01 2010")) 

mdy <- mdy(data$initialDiagnose) 
dmy <- dmy(data$initialDiagnose) 
mdy[is.na(mdy)] <- dmy[is.na(mdy)] # some dates are ambiguous, here we give 
data$initialDiagnose <- mdy  # mdy precedence over dmy 
data 

    initialDiagnose 
1  0010-04-02 
2  2009-01-14 
3  2005-09-22 
4  2010-04-21 
5  2010-01-28 
6  2009-09-01 
7  2005-03-28 
8  2005-04-01 
9  2005-04-01 
10  2010-09-17 
11  2010-03-01 
+0

Ist es nur der erste Wert, oder brauchst du eine allgemeinere Lösung für einen größeren Datensatz? –

+0

viele nützliche Informationen über die Umwandlung von 2-stelligen Jahren in 4-stellige Jahre hier: http://StackOverflow.com/Questions/9508747/add-correct-Century-to-Dates-with-Year-provided-as-year-ohne- century-y – jalapic

+1

Wenn Sie es einzeln analysieren, funktioniert es gut; Es ist nur so, dass die Vielfalt der Formate das Format "parse_date_time" sprengt, das zu weit rät. Angenommen, es handelt sich nicht um einen großen Vektor, dann loope es einfach und es funktioniert: 'do.call (c, lapply (Daten $ initialDiagnose, lubridate :: parse_date_time, orders = c ('mdy', 'dmy'))) ' – alistaire

Antwort

3

Ich denke, das auftritt, weil die mdy() Funktion das Jahr mit %Y (dem aktuellen Jahr) über %y (2 stellige Abkürzung für das Jahr, in Verzug zu 19XX anzupassen bevorzugt oder 20XX).

Es gibt jedoch eine Problemumgehung. Ich habe einen Blick auf die Hilfedateien für lubridate::parse_date_time (?parse_date_time), und am unteren Rand der Hilfedatei, gibt es ein Beispiel für das Hinzufügen eines Arguments, das mit dem Format %y über das %Y Format für das Jahr bevorzugt. Das entsprechende Stück Code aus der Hilfedatei:

## ** how to use `select_formats` argument ** 
## By default %Y has precedence: 
parse_date_time(c("27-09-13", "27-09-2013"), "dmy") 
## [1] "13-09-27 UTC" "2013-09-27 UTC" 

## to give priority to %y format, define your own select_format function: 

my_select <- function(trained){ 
    n_fmts <- nchar(gsub("[^%]", "", names(trained))) + grepl("%y", names(trained))*1.5 
    names(trained[ which.max(n_fmts) ]) 
} 

parse_date_time(c("27-09-13", "27-09-2013"), "dmy", select_formats = my_select) 
## '[1] "2013-09-27 UTC" "2013-09-27 UTC" 

Also, für Ihr Beispiel, können Sie diesen Code anzupassen und die mdy <- mdy(data$initialDiagnose) Linie mit diesem ersetzen:

# Define a select function that prefers %y over %Y. This is copied 
# directly from the help files 
my_select <- function(trained){ 
    n_fmts <- nchar(gsub("[^%]", "", names(trained))) + grepl("%y", names(trained))*1.5 
    names(trained[ which.max(n_fmts) ]) 
} 

# Parse as mdy dates 
mdy <- parse_date_time(data$initialDiagnose, "mdy", select_formats = my_select) 
# [1] "2010-04-02 UTC" NA    "2005-09-22 UTC" "2010-04-21 UTC" NA    
# [6] "2009-09-01 UTC" "2005-03-28 UTC" "2005-04-01 UTC" "2005-04-01 UTC" "2010-09-17 UTC" 
#[11] "2010-03-01 UTC" 

und die restlichen Zeilen Code ausgeführt wird von deiner Frage gibt es mir diesen Datenrahmen als Ergebnis:

initialDiagnose 
1  2010-04-02 
2  2009-01-14 
3  2005-09-22 
4  2010-04-21 
5  2010-01-28 
6  2009-09-01 
7  2005-03-28 
8  2005-04-01 
9  2005-04-01 
10  2010-09-17 
11  2010-03-01 
+0

Das ist perfekt. Vielen Dank. –

Verwandte Themen