POSIXct 对象为 NA,但 is.na() returns FALSE
POSIXct object is NA, but is.na() returns FALSE
我在 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"
这正是预期的结果。
有什么想法吗?
问题是您同时传递了 NA
和 na.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
我在 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"
这正是预期的结果。
有什么想法吗?
问题是您同时传递了 NA
和 na.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