2013-03-18 11 views
7

Doğum tarihini doğru bir şekilde işlemek için yaş 29 Şubat. işlevini lubridate paketinde kullanmayı denedim, ancak 29 Şubat 2004 doğumlu bir çocuk için bu, 28 Şubat 2006'da 2 yaşında bir yaş döndürüyor. Çocuk, 01-Mar-2006'da 2 yaşında olacaktır.
Ayrıca decimal_date işlevini kullanmayı denedim, ancak bu tarih = 01-Ocak-2006 olduğunda bana bir hata veriyor.Derive Age nerede DOB = 29 Feb

library (lubridate) 

MyTable <- data.frame(Eval.Date = c(as.Date("2006-01-01"), 
            as.Date(0:5, origin = "2006-02-26")), 
         Birth.Date = as.Date("2004-02-29")) 

MyTable$Age <- floor(new_interval(MyTable$Birth.Date, MyTable$Eval.Date)/
        duration(num = 1, units = "years")) 

MyTable$DecDate <- decimal_date(MyTable$Eval.Date) 

MyTable[,c("Birth.Date","Eval.Date","Age","DecDate")] 

Çıktı:

Birth.Date Eval.Date Age DecDate 
1 2004-02-29 2006-01-01 1  NaN 
2 2004-02-29 2006-02-26 1 2006.153 
3 2004-02-29 2006-02-27 1 2006.156 
4 2004-02-29 2006-02-28 2 2006.159 
5 2004-02-29 2006-03-01 2 2006.162 
6 2004-02-29 2006-03-02 2 2006.164 
7 2004-02-29 2006-03-03 2 2006.167 

Yardım - Ben R versiyonu 2.15.3 kullanıyorum

(2013-03-01) "Güvenlik Battaniye" İşte
benim kodudur decimal_date ile ya da yaş hesaplama takdir edilecektir.
Teşekkürler!

+3

Sözleşmeleri. NZ'de yasal olarak gelişmekte olan 28'inin kullanılması yasallaştırılmıştır. (paket yazar NZ'den) – mnel

cevap

1

bkz 22, 2014 bu hata düzeltildi.

Dene:

install.packages("lubridate") 
library(lubridate) 

MyTable <- 
    data.frame(Eval.Date = c(as.Date("2006-01-01"), 
          as.Date(0:1, origin = "2006-02-28"), 
          as.Date(0:2, origin = "2008-02-28")), 
      Birth.Date = as.Date("2004-02-29")) 

MyTable$Eval.Date.dec <- decimal_date(MyTable$Eval.Date) 
MyTable$Birth.Date.dec <- decimal_date(MyTable$Birth.Date) 

MyTable$Age <- 
    floor(MyTable$Eval.Date.dec - MyTable$Birth.Date.dec) 

MyTable[, c("Birth.Date", "Eval.Date", "Age", 
      "Birth.Date.dec", "Eval.Date.dec")] 

Çıktı: Ne dob olacağını ülke bağlıdır üzerinde

Birth.Date Eval.Date Age Birth.Date.dec Eval.Date.dec 
1 2004-02-29 2006-01-01 1  2004.161  2006.000 
2 2004-02-29 2006-02-28 1  2004.161  2006.159 
3 2004-02-29 2006-03-01 2  2004.161  2006.162 
4 2004-02-29 2008-02-28 3  2004.161  2008.158 
5 2004-02-29 2008-02-29 4  2004.161  2008.161 
6 2004-02-29 2008-03-01 4  2004.161  2008.164 
5

kaba kuvvet kullanarak: decimal_date bulunan böcek artık giderildiğini

library(lubridate) 

age <- function(ED, BD) { 
    year(ED) - year(BD) - 1 + 
    (month(ED) > month(BD) | 
     (month(ED) == month(BD) & day(ED) >= day(BD))) 
} 

transform(MyTable, age = age(Eval.Date, Birth.Date)) 
# Eval.Date Birth.Date age 
# 1 2006-01-01 2004-02-29 1 
# 2 2006-02-26 2004-02-29 1 
# 3 2006-02-27 2004-02-29 1 
# 4 2006-02-28 2004-02-29 1 
# 5 2006-03-01 2004-02-29 2 
# 6 2006-03-02 2004-02-29 2 
# 7 2006-03-03 2004-02-29 2