【问题标题】:failure to detect NA未检测到 NA
【发布时间】:2020-08-07 20:44:34
【问题描述】:

当我试图找到 NA 时,我遇到了如下问题。

dta = data.frame(group0 = c(1,1,1,2,2,2,3,3),
  date0 = c(as.Date("2018-09-01",format="%Y-%m-%d"),
                              as.Date("2018-09-02",format="%Y-%m-%d"),
                              as.Date("2018-09-03",format="%Y-%m-%d"),
                              as.Date("2018-09-04",format="%Y-%m-%d"),
                              as.Date("2018-10-01",format="%Y-%m-%d"),
                              as.Date("2018-10-02",format="%Y-%m-%d"),
                              as.Date("2018-10-02",format="%Y-%m-%d"),
                              as.Date("2018-10-03",format="%Y-%m-%d")),
  type0 = c("A","A","B","A","B","B","B","B"))

我有这样的数据,并尝试为每个组设置一个最短日期,条件如下。

    dta2 = dta %>% group_by(group0) %>% summarise(tmp_date0 = min(date0[type0 == "A"]))

那么,我有这个

> dta2
# A tibble: 3 x 2
  group0 tmp_date0 
   <dbl> <date>    
1      1 2018-09-01
2      2 2018-09-04
3      3 NA        

当我运行它时

> is.na(dta2$tmp_date0)
[1] FALSE FALSE FALSE

为什么第三个是FALSE

【问题讨论】:

  • 内部是Inf

标签: r date dplyr


【解决方案1】:

来自Inf 的强制转换,因为在返回logical(0) 的逻辑表达式中没有与“A”值匹配的值

min(logical(0))
#[1] Inf

因为它是Date 类,所以对NA 的强制不是真正的NA

as.Date(Inf) 
# NA

dput(as.Date(Inf))
#structure(Inf, class = "Date")

as.Date(Inf) %>%
    is.na
#[1] FALSE

如果我们检查dput,它会被强制为 NA,但它不是 NA

dput(dta2$tmp_date0)
#structure(c(17775, 17778, Inf), class = "Date")

is.finite 的检查进一步证明了这一点

is.finite(dta2$tmp_date0)
#[1]  TRUE  TRUE FALSE

为了防止min 作用于logical(0),一个选项是使用if/else 条件

dta3 <- dta %>% 
    group_by(group0) %>%
    summarise(tmp_date0 = if(any(type0 == 'A')) min(date0[type0 == 'A']) else NA)

现在,is.na 正确接收

is.na(dta3$tmp_date0)
#[1] FALSE FALSE  TRUE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 2018-12-11
    • 2019-11-25
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多