我尝试使用将NA日期向量中的na值替换为另一个值zoo::na.fill,但它NA用“ 1970-01-02”而不是我指定的值替换了我的值:
library(zoo)
a <- as.Date(c(NA, '2018-01-01'))
na.fill(a, as.Date('2018-01-02'))
[1] "1970-01-02" "2018-01-01"
Run Code Online (Sandbox Code Playgroud)
为什么会发生?是一个错误还是我需要指定一些东西以便它可以按预期工作?注意:我知道我们可以使用,a[is.na(a)] <- as.Date('2018-01-02')但是这个问题是关于na.fill动物园的
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"
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
而且class(coredata(object))是一样的class(a)这是Date。由于没有Date选项,as.cls默认为as.logical。
接下来发生的事情是fill(基本上)已as.cls应用了该参数。在这种情况下,它fill是一个非零值Date,它被强制1为用于填充的数字NA。
然后,最后将返回值强制转换object为日期类型。当然as.Date(1)是1970-01-02。