почему split coerce double в integer в R и есть ли обходной путь

можно строить даты в R из числовых типов, даже дробных значений. Это не очень распространено, но это происходит, например, при усреднении дат. К сожалению, они, кажется, ломаются split

> 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. Согласны ли люди с тем, что это ошибка, или мне не хватает глубокой причины? Есть обходные пути? Спасибо

1 ответов


по какой причине split.Date coerces Date ввод в integer:

> 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 говорит: "дата должна быть целым числом, но это не распространяется на внутреннее представление.". Некоторые могут считать это ошибкой. Я не уверен.

вы можете избежать этого путем вызова split.default напрямую.

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