心爱的zoo::na.*函数
zoo 包是处理NA 值的函数的绝佳来源,它们一直广泛用于非zoo 对象,但它们是为带有索引的数值的时间序列编写的。 zoo::na.* 的行为有时会在非数字向量上按预期工作,但有时不会,例如 zoo::na.fill 和其他一些情况。
它们在Date 向量上的行为概述
一些示例数据。我们使用zoo::as.Date,所以我不必每次都给出来源。
(a <- zoo::as.Date(c(10000, NA, 10002)))
#> [1] "1997-05-19" NA "1997-05-21"
(b <- zoo::as.Date(10001))
#> [1] "1997-05-20"
zoo::na.aggregate(a) # As expected
#> [1] "1997-05-19" "1997-05-20" "1997-05-21"
zoo::na.approx(a) # Converts to numeric
#> [1] 10000 10001 10002
zoo::as.Date(zoo::na.approx(a)) # Workaround
#> [1] "1997-05-19" "1997-05-20" "1997-05-21"
zoo::na.fill(a, b) # Coerces b to logical TRUE then to numeric - see below
#> [1] "1997-05-19" "1970-01-02" "1997-05-21"
zoo::as.Date(zoo::na.fill(as.numeric(a), as.numeric(b))) # Workaround
#> [1] "1997-05-19" "1997-05-20" "1997-05-21"
zoo::na.locf(a) # As expected
#> [1] "1997-05-19" "1997-05-19" "1997-05-21"
zoo::na.spline(a) # Converts to numeric
#> [1] 10000 10001 10002
zoo::as.Date(zoo::na.spline(a)) # Workaround
#> [1] "1997-05-19" "1997-05-20" "1997-05-21"
zoo::na.trim(c(NA, NA, a, NA, NA)) # Converts to numeric
#> [1] 10000 NA 10002
zoo::as.Date(zoo::na.trim(c(NA, NA, a, NA, NA))) # Workaround
#> [1] "1997-05-19" NA "1997-05-21"
zoo::na.fill 上Date 向量的详细信息
在na.fill.zoo(最终完成工作)的源代码中是这样的:
as.cls <- if (is.integer(coredata(object))) {
as.integer
}
else if (is.numeric(coredata(object))) {
as.numeric
}
else if (is.character(coredata(object))) {
as.character
}
else {
as.logical
}
而class(coredata(object)) 与class(a) 相同,即Date。由于没有Date 选项,as.cls 默认为as.logical。
接下来发生的事情是fill 参数(基本上)已应用as.cls。在这种情况下,fill 是一个非零的Date,它被强制转换为用于填充NA 的数字1。
然后在最后将返回值强制为object 的类,即日期。当然as.Date(1) 是1970-01-02。