【问题标题】:na.fill for date showing the unexpected resultsna.fill 显示意外结果的日期
【发布时间】:2018-09-22 23:01:15
【问题描述】:

我尝试使用 zoo::na.fill 将日期向量中的 NA na 值替换为另一个值,但它用“1970-01-02”而不是我指定的值替换了我的 NA 值:

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"

为什么会这样?是错误还是我需要指定某些内容才能按预期工作 注意:我知道我们可以使用a[is.na(a)] &lt;- as.Date('2018-01-02'),但这个问题是关于动物园中的na.fill

【问题讨论】:

  • library(tidyverse)library(lubridate) 之类的内容放在您的示例代码中总是一个好主意,这样当人们剪切和粘贴代码时它就可以工作。
  • @ngm: 或删除需要数十个包依赖项的代码。 :)
  • zoo 的开发版本现在有na.fill0,它在这种情况下确实有效:install.packages("zoo", repos="http://R-Forge.R-project.org"); na.fill0(a, as.Date('2018-01-02')) 最终,na.fill 将调用na.fill0(就像na.locf 调用na.locf0)但是预计na.fill0 将继续可供用户访问,即使在此之后,正如na.locf0 可供用户访问一样。请注意,na.fill0na.locf0 一样,仅适用于向量,不适用于矩阵。

标签: r date zoo


【解决方案1】:

心爱的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.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
    }

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

【讨论】:

  • 有道理,因为zoo是时间序列的,所以这个函数没有考虑时间值。所以我们应该坚持使用 is.na 来填补这种情况。非常感谢
  • 我想你是对的。但是zoo::na.* 函数非常方便和广泛,它们可以很好地用于向量而不是时间序列对象。不是开发者的错!
猜你喜欢
  • 2018-04-25
  • 1970-01-01
  • 2020-08-01
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多