【问题标题】:why is.na and !="" filter out the info differently为什么 is.na 和 !="" 以不同的方式过滤信息
【发布时间】:2021-08-28 04:20:05
【问题描述】:

我有一个 df df12,我在上面运行了以下代码。我认为结果应该是相同的,但不是。谁能告诉我为什么?如果TYN是na,应该is.na(TYN) belong to TYN!="Yes"

df12<-structure(list(Test = c("OK", "NA", "NA", "NA"), TYN = c(NA, 
NA, NA, NA)), row.names = c(NA, -4L), class = c("tbl_df", "tbl", 
"data.frame"))

df13<-df12 %>%
  mutate(Rel=case_when(Test %in% c("OK", "Good")~"Pass",
                       Test %in% c("NA") & TYN!="Yes"~"NA",
                       Test %in% c("Fail", "NA")~"Fail"))

df14<-df12 %>%
  mutate(Rel=case_when(Test %in% c("OK", "Good")~"Pass",
                       Test %in% c("NA") & is.na(TYN)~"NA",
                       Test %in% c("Fail", "NA")~"Fail"))

【问题讨论】:

    标签: r


    【解决方案1】:

    TYN != 'Yes' 不等于 is.na(TYN)

    在这两种情况下,第二个条件就是我们正在检查的内容。

    对于第一种情况TYN != 'Yes' 返回所有NAs

    df12$TYN != 'Yes'
    #[1] NA NA NA NA
    

    因此,代码会检查第三个条件Test %in% c("Fail", "NA")

    df12$Test %in% c("Fail", "NA")
    #[1] FALSE  TRUE  TRUE  TRUE
    

    因此,在第一种情况下,您得到了 'Fail' 作为输出。

    对于第二种情况 is.na 有效 -

    df12$Test %in% "NA" & is.na(df12$TYN)
    #[1] FALSE  TRUE  TRUE  TRUE
    

    因此,在这种情况下,您将获得第二个条件的输出,即"NA"

    【讨论】:

    • 当 TYN==na 时,是否符合 TYN!="Yes"?为什么它返回“NA”而不是 TRUE?
    • "NA"NA 之间存在差异。 "NA" 只是字符串值,但您在数据中拥有的是真实的 NA。那些NA 可以用is.na(..)!is.na(...) 进行测试。
    • 所以真正的NA只能用is.na()!is.na()来测试,不能用别的方法吧?
    【解决方案2】:

    NAs 不是真正的 NA,即它们是 "NA"。我们可以用type.convert 转换回来

    library(dplyr)
    type.convert(df12, as.is = TRUE) %>%
      mutate(Rel=case_when(Test %in% c("OK", "Good")~"Pass",
                           is.na(Test) & is.na(TYN)~"NA",
                           Test %in% c("Fail", "NA")~"Fail"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-22
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多