首页 > 解决方案 > 未检测到 NA

问题描述

虽然我试图找到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

标签: rdatedplyr

解决方案


有一个强制 fromInf因为在返回的逻辑表达式中没有与“A”的值匹配的值logical(0)

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

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

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

推荐阅读