2015-01-09 8 views
6

R sayılarındaki R sayıları, hatta kesirli değerler bile oluşturabilirsiniz. Çok yaygın değil, ancak tarihlerin ortalaması alındığında gerçekleşir. Ne yazık ki,niçin ayrıklık durumu R'de tamsayıya bölünür ve bir geçici çözüm var

> as.Date(-1, origin = "1970-01-01") 
[1] "1969-12-31" 
> as.Date(-1.0001, origin = "1970-01-01") 
[1] "1969-12-30" 
> split(as.Date(-1, origin = "1970-01-01"), 1)[[1]] 
[1] "1969-12-31" 
> split(as.Date(-1.0001, origin = "1970-01-01"), 1)[[1]] 
[1] "1969-12-31" #this is wrong 
> unclass(split(as.Date(-1, origin = "1970-01-01"), 1)[[1]]) 
[1] -1 
> unclass(split(as.Date(-1.0001, origin = "1970-01-01"), 1)[[1]]) 
[1] -1 #this is "why" 

split Yani farklı olan iki tarih bir split tarafından eşit yapılır kırmak gibi görünüyor. İnsanlar bunun bir hata olduğu konusunda mutabık mı yoksa derin sebebi mi özlüyorum? Herhangi bir geçici çözüm var mı? Teşekkür

Sebebi ne olursa olsun
+0

Strawman'ın geçici çözümü: 'lapply (split (as.character (tarihler), index), as.Date). Tarihi korur, ancak alttaki gösterimi değiştirir. Belli durumlarda yavaş bir "lapply" ye ihtiyaç duyar. – piccolbo

cevap

6

, split.Date tamsayıya Date girişi coerces:, tarih bir tamsayı olmalıdır

> split.Date 
function (x, f, drop = FALSE, ...) 
{ 
    y <- split.default(as.integer(x), f, drop = drop) 
    for (i in seq_along(y)) class(y[[i]]) <- "Date" 
    y 
} 
<bytecode: 0x2effb98> 
<environment: namespace:base> 

?Date diyor, bu durum asgari fonksiyonu ve dokümantasyon arasında bir mutsuzluk olan," ama Bu iç temsilde zorlanmaz. " Bazıları bunun bir hata olduğunu düşünebilir. Emin değilim.

Doğrudan split.default numaralı telefonu arayarak bunu önleyebilirsiniz.

> split.default(as.Date(-1.0001, origin = "1970-01-01"), 1)[[1]] 
[1] "1969-12-30" 
+0

Yolu yok! Bu yöntemi yazmanın tek amacı bu hatayı tanıtmaktı. Varsayılan sadece iyi çalışıyor. Teşekkürler – piccolbo

+1

@piccolbo 'svn annotate src/kitaplık/taban/R/dates.R' beni giriş için motivasyonla birlikte https://stat.ethz.ch/pipermail/r-devel/2008-July/050134.html adresine yönlendiriyor performans (hala> 1e6 elemanlarının vektörleri için önemli). Açıkça doğru olsa da, daha önemli. –

+0

teşekkürler @MartinMorgan, daha fazla acıyı bağışladı. Öyle görünüyor ki, her zaman split.default tarafından for döngüsünde, sondan önceki satırda harcanıyor. Neden bu kadar yavaş olduğundan emin değilim. Uzlaşma, as.numeric ile as.integer değiştiriliyor olabilir, ancak bu çift Tarihlerin kullanımını daha yaygın hale getirecektir, ve söylediğin gibi, bu en iyisidir. Daha iyi bir uzlaşma x = if (is.double (x)) x else as.integer (x) olabilir. Hata bildirimi kaydettiğimde, bunu göndermek için başkalarına bırakacağım. – piccolbo