na。填写日期以显示意外结果

duc*_*169 3 r date zoo

我尝试使用将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动物园的

ngm*_*ngm 5

最受欢迎的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.fillDate向量

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