gpt4 book ai didi

r - na.fill 显示意外结果的日期

转载 作者:行者123 更新时间:2023-12-04 09:43:42 26 4
gpt4 key购买 nike

我试图更换一个 NA使用 zoo::na.fill 的日期向量中的 na 值与另一个值, 但它取代了我的 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"

为什么会这样?这是一个错误还是我需要指定一些东西才能按预期工作 注意:我知道我们可以使用 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"

关于 Date 向量的 zoo::na.fill 的详细信息

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

关于r - na.fill 显示意外结果的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49802523/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com