【问题标题】:Remove 'empty cells' as factor level删除“空单元格”作为因子级别
【发布时间】:2014-08-27 08:17:49
【问题描述】:

我有一个数据框,它有一列,一列有一些数据和一些空单元格。 当我检查该列的级别时,它显示三个级别,因为它将空单元格作为一个级别。我想删除那个级别。 假设我有

df <- data.frame(fan = c("a","b"," ","a","b")) 

我试过这个代码

droplevels(df)

但它不起作用。

【问题讨论】:

    标签: r


    【解决方案1】:

    试试:

     df$fan[grepl("^\\s*$", df$fan)] <- NA #in case you have  c(" ", "", "a", "b", "   ")
    

    说明

    ^(|\\s+)$- 匹配空引号'' 或引号(" ", " ", " ") 中的空格。因此,更笼统。

      str(droplevels(df))
      #'data.frame':    5 obs. of  1 variable:
      #$ fan: Factor w/ 2 levels "a","b": 1 2 NA 1 2
    

    如果你想创建一个删除空单元格的新数据集

      df1 <- droplevels(df[!grepl("^\\s*$", df$fan),,drop=FALSE] )
      str(df1)
      #'data.frame':    4 obs. of  1 variable:
      #$ fan: Factor w/ 2 levels "a","b": 1 2 1 2
    

    【讨论】:

    • \\s* 会比 (|\\s+) 简单
    • @hadley 感谢您的建议。我修改了代码
    【解决方案2】:

    'droplevels' 确实有效。无需复杂代码:

    df <- data.frame(fan = c("a","b"," ","a","b")) 
    df
    #  fan
    #1   a
    #2   b
    #3    
    #4   a
    #5   b
    
    df$fan[df$fan==' ']=NA
    df$fan = droplevels(df$fan)
    str(df)
    #'data.frame':   5 obs. of  1 variable:
    # $ fan: Factor w/ 2 levels "a","b": 1 2 NA 1 2
    

    【讨论】:

      【解决方案3】:

      如果您使用的是 csv,这可能会有所帮助:

      data<-read.csv(file = "data.csv", na.strings = "", stringsAsFactors = T)
      

      我修改了之前的回复,添加了, stringsAsFactors = T 所以,以后它不会像Createtableone那样在任何后续分析中报告NA

      【讨论】:

      • 如果问题实际上有空单元格,这是正确的解决方案,就像我一样。出于某种原因,我还没有完全弄清楚,通过 readr::read.csv2 导入的数据集中的一些空白单元格不会作为 NA 导入,而是保留为没有任何存储值或 NA 的空白单元格。因子列也没有将空白值记录为任何级别,即使它确实发生在同一导入的不同列中。明确指定空白单元格作为 NA 解决了它。
      【解决方案4】:

      当您将文件读入 R 时,您可以通过在 read.csv(或 read.xxx)中使用 na.strings 参数首先避免将“空单元格”作为因子级别包含在内。 na.strings 参数定义“将被解释为 NA 值的字符串”。

      这是一个示例,其中我读取了我从您的“df”创建的文本文件 (foo.csv):

      read.csv(file = "foo.csv", na.strings = " ")
      #    fan
      # 1    a
      # 2    b
      # 3 <NA>
      # 4    a
      # 5    b
      
      str(as.factor(df2$fan))
      # Factor w/ 2 levels "a","b": 1 2 NA 1 2
      

      读取文件时,空字段现在被视为NA,因此“空白”不包含在因子级别中。

      来自?read.table:“空白字段 [...] 被认为是逻辑、整数、数字和复杂字段中的缺失值”。但是,在您的数据中,变量“fan”是character。如果您在options 或read.xxx 中有stringsAsFactors = TRUE,则character 向量将转换为factor。

      【讨论】:

        猜你喜欢
        • 2012-06-23
        • 2022-11-24
        • 2017-02-13
        • 2019-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-24
        • 2019-06-18
        相关资源
        最近更新 更多