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
Ist es nur der erste Wert, oder brauchst du eine allgemeinere Lösung für einen größeren Datensatz? –
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
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