代码之家  ›  专栏  ›  技术社区  ›  gaut

is.na R中NaN值的状态

r
  •  0
  • gaut  · 技术社区  · 1 年前

    所以我正在开发这个功能

    #' Disambiguated Equality operator between two vectors that may contain NA's
    #'
    #' Forces the equality result to be TRUE if both corresponding vector elements are either equal, or both NA.
    #' @param x vector of any type compatible with is.na and ==.
    #' @param y vector of any type compatible with is.na and ==.
    #' @export
    #' @examples 
    #' c(NA, 1:5) %==% c(NA, 1:3,"nope", NA) #[1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE
    
    gp.is.equal.force <- `%==%` <- function(x, y, vect = T) {
      res <- (is.na(x) & is.na(y)) | (!is.na(x) & !is.na(y) & x == y)
      if (!vect) res <- all(res)
      res
    }
    

    我注意到,在R版本4.3.2(2023-10-31)中,NaN值出现了一种我意想不到的行为——“眼孔”。

    > is.na(NaN) # [1] TRUE
    > is.na(c(NaN, 5)) # [1]  TRUE FALSE
    > is.na(c(NaN, NA)) # [1] TRUE TRUE
    > is.nan(c(NaN, NA)) # [1]  TRUE FALSE
    > is.na(c(NaN, as.factor("abc"))) # [1]  TRUE FALSE
    > is.nan(c(NaN, 5)) # [1]  TRUE FALSE
    

    然而,到目前为止一切都很好:

    > is.na(c(NA, NaN, "abc")) # [1]  TRUE FALSE FALSE
    > is.nan(c(NA, NaN, "abc")) # [1] FALSE FALSE FALSE
    > is.nan(c(NaN, "abc")) #[1] FALSE FALSE
    

    似乎在添加 character s的加入以某种方式打破了逻辑 NaN 价值观 这不是很奇怪吗?

    1 回复  |  直到 1 年前
        1
  •  2
  •   benson23    1 年前

    从…起 ?NaN (我的大胆),

    Inf和-Inf是正无穷大和负无穷大,而 NaN的意思不是数字。(这些适用于数值以及复值的实部和虚部,但不适用于整向量的值。)

    将字符添加到向量中将强制该向量为字符类型,因此 NaN 不再表示“不是数字”,而是字符“NaN”。

    c(NA, NaN, "abc")
    [1] NA    "NaN" "abc"
    

    正如预期的那样, is.nan 将返回 FALSE 对于字符。

    is.nan(c(NaN, "NaN"))
    [1] FALSE FALSE
    is.nan(c(NaN, NaN))
    [1] TRUE TRUE