2012-02-29 7 views
13

Mam plik z urodzinami w formacie %d%b%y. Niektóre np.Dodaj poprawny wiek do dat z roku podany jako "Rok bez wieku",% y

# "01DEC71" "01AUG54" "01APR81" "01MAY81" "01SEP83" "01FEB59" 

Próbowałem sformatować datę jako

o108$fmtbirth <- format(as.Date(o108$birth, "%d%b%y"), "%Y/%m/%d") 

i jest to wynik

# "1971/12/01" "2054/08/01" "1981/04/01" "1981/05/01" "1983/09/01" "2059/02/01" 

Są urodziny i widzę 2054. Od tego page widzę, że wartości rocznie w latach 00 i 68 są kodowane jako 20 dla wieku. Czy istnieje sposób, aby włączyć ten, w moim przypadku chcę tylko 00 do 12 mają być kodowane jako 20.

Odpowiedz

21

1) Chrońmy. chron domyślnie używa 30, więc konwertuje je najpierw na Data (ponieważ chron nie może odczytać tego rodzaju dat), zmieniając format na postaci z dwucyfrowymi latami w format, który chron może zrozumieć i ostatecznie wrócić do daty.

library(chron) 
xx <- c("01AUG11", "01AUG12", "01AUG13") # sample data 
as.Date(chron(format(as.Date(xx, "%d%b%y"), "%m/%d/%y"))) 

To daje odcięcia od 30, ale możemy uzyskać odcięcie 13 Korzystanie chron.year.expand opcję Crohna:

library(chron) 
options(chron.year.expand = 
    function (y, cut.off = 12, century = c(1900, 2000), ...) { 
     chron:::year.expand(y, cut.off = cut.off, century = century, ...) 
    } 
) 

a następnie powtórzenie oryginalnego konwersję. Na przykład zakładając, że zabrakło tego oświadczenia opcji już chcemy uzyskać następujące z naszych xx:

> as.Date(chron(format(as.Date(xx, "%d%b%y"), "%m/%d/%y"))) 
[1] "2011-08-01" "2012-08-01" "1913-08-01" 

2) Data tylko. Oto alternatywa, która nie używa chron. Może chcesz zastąpić "2012-12-31" z Sys.Date() jeśli chodzi o to, że w przeciwnym razie przyszłe terminy są naprawdę należy ustawić 100 lat wstecz:

d <- as.Date(xx, "%d%b%y") 
as.Date(ifelse(d > "2012-12-31", format(d, "19%y-%m-%d"), format(d))) 

EDIT: daty dodania jedyne rozwiązanie.

+4

+1 dla Data jedynym rozwiązaniem – russellpierce

+0

+1 jednak pewien wyjątek Datą tylko rozwiązanie: wyjście nie jest już klasa Date, ale postać, więc arytmetyka będzie wymagać transformacja wsteczna wyjścia. Oy vey. – AdamO

+0

Jest to forma 'as.Date (...)' tak wyraźnie jest z klasy 'Date'. –

11

Patrz odpowiedź z related thread:

format(as.Date("65-05-14", "%y-%m-%d"), "19%y-%m-%d")