【问题标题】:What is the difference between <NA> and NA?<NA> 和 NA 有什么区别?
【发布时间】:2013-04-21 15:38:52
【问题描述】:

我有一个名为 SMOKE 的因子,其级别为“Y”和“N”。缺失值被替换为 NA(从初始级别“NULL”开始)。但是,当我查看因素时,我会得到如下信息:

head(SMOKE)
# N N <NA> Y Y N
# Levels: Y N

为什么 R 将 NA 显示为 &lt;NA&gt;?有区别吗?

【问题讨论】:

    标签: r na missing-data


    【解决方案1】:

    当您处理factors 时,当NA 用尖括号(&lt;NA&gt;)包裹时,这表明它实际上是NA。

    如果是NA不带括号,则不是 NA,而是标签为"NA"的适当因子

    # Note a 'real' NA and a string with the word "NA"
    x <- factor(c("hello", NA, "world", "NA"))
    
    x
    [1] hello <NA>  world NA   
    Levels: hello NA world      <~~ The string appears as a level, the actual NA does not. 
    
    as.numeric(x)              
    [1]  1 NA  3  2            <~~ The string has a numeric value (here, 2, alphabetically)
                                   The NA's numeric value is just NA
    

    编辑回答@Arun 的问题:

    R 只是试图区分一个字符串,其值为两个字母"NA" 和一个实际缺失值NA 因此,您在显示 dfdf$y 时看到的差异。示例:

    df <- data.frame(x=1:4, y=c("a", NA_character_, "c", "NA"), stringsAsFactors=FALSE)
    

    注意NA的两种不同风格:

    > df
      x    y
    1 1    a
    2 2 <NA>
    3 3    c
    4 4   NA
    

    但是,如果我们只看 'df$y'

    [1] "a"  NA   "c"  "NA"
    

    但是,如果我们去掉引号(类似于我们在控制台打印 data.frame 时看到的):

    print(df$y, quote=FALSE)
    [1] a    <NA> c    NA  
    

    因此,我们再次通过尖括号区分NA

    【讨论】:

    • 感谢您为我澄清这一点
    • RicardoSaporta,我有点不清楚。在检查this answer from @SimonO101 时,我发现如果你有一个data.frame,例如:df &lt;- data.frame(x=1:5, y=c("a", "b", NA_character_, "d"), stringsAsFactors=FALSE),它仍然是&lt;NA&gt;。当然,问题是针对向量的。但是,这对我来说还不清楚。例如:当您打印列时,df$y 它会消失。但是当你打印df 时,它会显示尖括号。
    • 另见addNA(),例如levels(addNA(x))
    • 也可能值得展示:factor(c("NA", "&lt;NA&gt;", NA))。查看某物的印刷表示并不是了解它是什么的好方法!
    【解决方案2】:

    这正是 R 在一个因子中显示 NA 的方式:

    > as.factor(NA)
    [1] <NA>
    Levels: 
    > 
    > f <- factor(c(1:3, NA))
    > levels(f)
    [1] "1" "2" "3"
    > f
    [1] 1    2    3    <NA>
    Levels: 1 2 3
    > is.na(f)
    [1] FALSE FALSE FALSE  TRUE
    

    人们认为这是一种区分 NA"NA" 的方法,因为它打印不带引号的因子,即使对于字符标签/级别也是如此:

    > f2 <- factor(c("NA",NA))
    > f2
    [1] NA   <NA>
    Levels: NA
    > is.na(f2)
    [1] FALSE  TRUE
    

    【讨论】:

      【解决方案3】:

      data.table 可能是一个例外。 似乎一个字符字段将其打印为 ,而将数字字段打印为 NA。注意:我在 中添加了多余的空格,否则此网页无法正常显示。

      library("data.table")
      
      y<-data.table(a=c("a","b",NA))
      
      print(y)
            a
      1:    a
      2:    b
      3: < NA >
      
      factor(y$a)
      
      [1] a    b    < NA >
      
      Levels: a b
      
      ## we enter a numeric argument
      
      y<-data.table(a=c(1,2,NA))
      
      print(y)
          a
      1:  1
      2:  2
      3: NA
      
      factor(y$a)
      
      [1] 1    2    < NA >
      
      Levels: 1 2
      

      【讨论】:

      • 我不确定这是什么异常。上面的答案基本上说当NAfactorcharacter中时,它被打印为&lt;NA&gt;。这与您使用 data.table 演示的相同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 2016-05-30
      • 2014-03-09
      • 1970-01-01
      • 2019-08-21
      • 2010-10-02
      相关资源
      最近更新 更多