【问题标题】:POSIXct object is NA, but is.na() returns FALSEPOSIXct 对象为 NA,但 is.na() 返回 FALSE
【发布时间】:2018-09-28 19:06:34
【问题描述】:

我在 R 中遇到了一些非常奇怪的行为。我认为它甚至可能是一个错误,但我在这里要求检查是否有人熟悉它或知道解决方案。

我想要做的是:我有一个数据框,其中包含分配给组的日期。我正在对这些组执行 for 循环,在其中计算该组中日期的最大值。如果这个最大日期是NA,我想跳过循环的其余部分 (next)。但是,这不会正确发生。

考虑以下代码:

library(dplyr)
library(lubridate)
a <- data.frame(group = c(1,1,1,1,1, 2,2,2,2, 3),
            ds = as_datetime(dmy('01-01-2018', NA, '03-01-2018', NA, '05-01-2018',
                                 '02-01-2018', '04-01-2018', '06-01-2018', '08-01-2018',
                                 NA)))

for (i in 1:3) {
  max_ds <- a %>% filter(group == i) %>% .$ds %>% max(na.rm = T)
  if (is.na(max_ds)) { next }
  print(max_ds)
}

预期的输出是:

# [1] "2018-01-05 UTC"
# [1] "2018-01-08 UTC"

但是,得到的输出是:

# [1] "2018-01-05 UTC"
# [1] "2018-01-08 UTC"
# [1] NA

这个谜团的症结似乎在于na.rm 子句。如果将其删除,则会发生以下情况:

for (i in 1:nr_groups) {
  max_ds <- a %>% filter(group == i) %>% .$ds %>% max()
  if (is.na(max_ds)) { next }
  print(max_ds)
}

# [1] "2018-01-08 UTC"

这正是预期的结果。

有什么想法吗?

【问题讨论】:

  • max(NA, na.rm = TRUE)的输出。
  • 所以你说max_ds 等于-Inf,这就解释了为什么is.na 返回FALSE。但是,为什么它打印为 NA?
  • 因为它是一个日期时间类:见max(as.POSIXct(NA), na.rm = TRUE)as.POSIXct(-Inf, origin = "1900-01-01")
  • 这就解释了。奇怪这如何评估为 NA,打印为 NA,但 is.na 返回 FALSE。但是,is.na(as_date(NA)) 返回 TRUE
  • 它不会评估为NA

标签: r date dplyr lubridate posixct


【解决方案1】:

问题是您将NAna.rm = TRUE 一起传递。然后会发生这种情况:

max(NA, na.rm = TRUE)
#[1] -Inf
#Warning message:
#In max(NA, na.rm = TRUE) : no non-missing arguments to max; returning -Inf

结果显然不是NA。如果传递一个日期时间变量,结果仍然不是NA,而是打印为NA

max(as.POSIXct(NA), na.rm = TRUE)
#[1] NA
#Warning message:
#In max.default(NA_real_, na.rm = TRUE) :
#  no non-missing arguments to max; returning -Inf
as.POSIXct(-Inf, origin = "1900-01-01")
#[1] NA
unclass(as.POSIXct(-Inf, origin = "1900-01-01"))
#[1] -Inf
#attr(,"tzone")
#[1] ""

您可能想使用is.finite 进行测试:

!is.finite(max(as.POSIXct(NA), na.rm = TRUE))
#[1] TRUE
#Warning message:
#In max.default(NA_real_, na.rm = TRUE) :
#  no non-missing arguments to max; returning -Inf

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 2020-11-29
    • 2010-09-14
    • 2011-12-17
    • 1970-01-01
    • 2012-11-10
    相关资源
    最近更新 更多