2016-07-21 153 views
0

我想將一列日期轉換爲R中的日期對象,但我似乎無法得到所需的結果。這些人的出生日期在1970年1月1日之前,因此當我使用as.Date時,R將例如1/12/54的日期轉換爲2054-01-12。我該如何解決這個問題?非常感謝。1970年1月1日之前轉換日期在R

+3

你怎麼能決定什麼是正確的,例如如果是'1/1/16':是2016年還是1916年? – Christoph

+0

@christoph在「69」後的兩位數年份必須是** 18 ** 70。 – Spacedman

回答

2

如果一切都在20世紀,那麼它就是一條線 - 只是在開始時用一個兩位數的年份格式化它,然後在前面打一個19,然後轉換爲日期。再次。男人這會看起來很酷有些%>%的東西:

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" 

如果從「69」年的「99」是1800年,那麼這裏就是另外一個班輪:

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" 

注意不徹底的測試,因此可能是一些錯誤的錯誤或我混合了幾個月和幾天,因爲你需要是ISO8601 Compliant

+0

Upvote只是爲了''%>%'的創造性破壞。 –

+0

這正是我所需要的。 – user122514

1

我會做:

library(lubridate) 

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

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

在年份=「70」後失敗。 OP的狀態出生在1970-01-01之前,所以「1/12/74」應該是** 1874 ** – Spacedman

+0

很明顯,將這個應用於矢量將需要更強大的解決方案,但我非常確定OP可以編寫一個' ifelse'或兩個使用我提供的工具到達那裏! –

+0

感謝您的回覆。 :-) – user122514

4

無需附加軟件包,基礎R是罰款。但是,你需要指定世紀:

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

如果你需要非默認格式,只需指定他們:

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

編輯:如果你的數據,其實就是在使用%y%格式,和你碰巧做出政策決定,即19世紀的需要 ,這裏是這樣做的一個基礎R方式:

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

我認爲這個答案對OP沒有幫助,因爲你沒有解釋你如何「指定」世紀,也就是說,你如何從字符串** vector **得到格式爲「%m /%d /%y 「到」%m /%d /%Y「。我很確定OP知道'as.Date(「1954-01-12」)會給他/她他/她需要的東西,但是他/她沒有這種格式。 –

+0

我添加了一個基本的R方法。仍然不需要附加組件。 –

+0

看起來好多了! –

相關問題