2016-07-21 9 views
0

Ich versuche, eine Spalte von Daten in Date-Objekte in R zu konvertieren, aber ich kann nicht scheinen, die gewünschten Ergebnisse zu erhalten. Diese Personen haben Geburtsdaten vor dem 1. Januar 1970, also wenn ich as.DateR verwende, konvertiert ein Datum wie 1/12/54 zum Beispiel zu 2054-01-12. Wie kann ich das umgehen? Vielen Dank.Konvertieren von Daten vor dem 1. Januar 1970 in R

+3

Wie können Sie entscheiden, was richtig ist, z im Falle '1/1/16': Ist es 2016 oder 1916? – Christoph

+0

@christoph nichts mit einem 2-stelligen Jahr nach "69" muss ** 18 ** 70 sein. – Spacedman

Antwort

2

Wenn alles in den 1900er Jahren ist, ist es ein One-Liner - nur formatieren Sie es mit einem zweistelligen Jahr am Anfang und schlagen Sie eine 19 auf der Vorderseite und konvertieren zu einem Datum. Nochmal. Man würde dies aussehen etwas%>% Hamlish:

s = c("1/12/54","1/12/74") 
as.Date(format(as.Date(s,format="%d/%m/%y"), "19%y%m%d"), "%Y%m%d") 
# [1] "1954-12-01" "1974-12-01" 

Wenn Jahren von "69" bis "99" sind 1800er Jahren, dann ist hier ein weiterer Einzeiler:

library(dplyr) # for pipe operator: 
s %>% as.Date(format="%d/%m/%y") %>% 
    format("%y%m%d") %>% 
    (function(d){ 
     paste0(ifelse(d>700101,"18","19"),d) 
     }) %>% 
    as.Date("%Y%m%d") 

## [1] "1954-12-01" "1874-12-01" 

Hinweis nicht gründlich getestet, so möglicherweise einige off-by-one-Fehler oder ich habe Monate und Tage gemischt, weil Sie müssen ISO8601 Compliant

+0

Upvote nur für kreative Zerstörung durch die '%>%'. –

+0

Das ist genau das, was ich brauchte. – user122514

1

ich tun würde:

library(lubridate) 

x <- as.Date("1/12/54", format = "%m/%d/%y") 
year(x) <- 1900 + year(x) %% 100 

> x 
[1] "1954-01-12" 
+0

schlägt fehl für Daten nach Jahr = "70". OP besagt, dass Geburtsdaten vor 1970-01-01 sind, also "1/12/74" sollte ** 1874 ** – Spacedman

+0

Offensichtlich würde das Anwenden auf einen Vektor eine robustere Lösung erfordern, aber ich bin ziemlich sicher, dass OP ein 'schreiben kann Ifelse oder zwei, um dort mit den Werkzeugen zu kommen, die ich zur Verfügung gestellt habe! –

+0

Vielen Dank für Ihre Antwort. :-) – user122514

4

Keine Notwendigkeit für Add-On-Pakete ist Basis R in Ordnung. Aber Sie müssen das Jahrhundert spezifizieren:

R> as.Date("1954-01-12") 
[1] "1954-01-12" 
R> 

Wenn Sie Nicht-Standard-Formate benötigen, sie nur angeben:

R> as.Date("19540112", "%Y%m%d") 
[1] "1954-01-12" 
R> 

Edit: Falls Ihre Daten wirklich im Umgang mit dem %y% Format kommt, und Sie geschehen, um die Richtlinie zu entscheiden, dass das 19. Jahrhundert benötigt wird , hier ist eine Basis R Art und Weise tun:

R> d <- as.Date("540112", "%y%m%d") 
R> dlt <- as.POSIXlt(d) 
R> dlt$year <- dlt$year - 100 
R> as.Date(dlt) 
[1] "1954-01-12" 
R> 
+0

Ich denke diese Antwort hilft OP nicht, da du nicht erklärst, wie du das Jahrhundert "spezifizierst", das heißt, wie du von einem String ** Vektor ** des Formats "% m /% d /% y" kommst "bis"% m /% d /% Y ". Ich bin mir ziemlich sicher, OP ist sich bewusst, dass 'as.Date (" 1954-01-12 ") ihm/ihr geben würde, was er/sie braucht, aber er/sie hat dieses Format nicht. –

+0

Ich habe eine Basis R hinzugefügt. Noch keine Notwendigkeit für Add-ons. –

+0

Das sieht besser aus! –

Verwandte Themen