【问题标题】:R how to change one of the level to NAR如何将级别之一更改为NA
【发布时间】:2014-08-18 00:38:17
【问题描述】:

我有一个数据集,其中一列的因子水平为"a" "b" "c" "NotPerformed"。如何将所有 "NotPerformed" 因素更改为 NA?

【问题讨论】:

    标签: r r-factor


    【解决方案1】:

    将级别设置为 NA:

    x <- factor(c("a", "b", "c", "NotPerformed"))
    x
    ## [1] a            b            c            NotPerformed
    ## Levels: a b c NotPerformed
    levels(x)[levels(x)=='NotPerformed'] <- NA
    x
    ## [1] a    b    c    <NA>
    ## Levels: a b c
    

    请注意,因子水平已被删除。

    【讨论】:

    • 附带说明,虽然x[x=="NotPerformed"] &lt;- NA 将用NA 替换值,但它不会删除'NotPerformed' 因子级别。这就是为什么这种方法更可取的原因。
    【解决方案2】:

    我修改了我的旧答案,并提供了截至 2016 年 9 月您可以做什么。随着 dplyr 软件包的开发,现在您可以使用 recode_factor() 来完成这项工作。

    x <- factor(c("a", "b", "c", "NotPerformed"))
    
    # [1] a            b            c            NotPerformed
    # Levels: a b c NotPerformed
    
    library(dplyr)
    recode_factor(x, NotPerformed = NA_character_)
    # [1] a    b    c    <NA>
    # Levels: a b c
    

    【讨论】:

    • 这可以更新为包含forcats 包:fct_recode(x, NULL = "NotPerformed")
    【解决方案3】:

    或者简单地使用内置的exclude 选项,无论初始变量是字符还是因子,它都有效。

    x <- c("a", "b", "c", "NotPerformed")
    
    factor(x, exclude = "NotPerformed")
    [1] a    b    c    <NA>
    Levels: a b c
    
    factor(factor(x), exclude = "NotPerformed")
    [1] a    b    c    <NA>
    Levels: a b c
    

    【讨论】:

      【解决方案4】:

      将级别之一设置为NAtidyverse 管道%&gt;%
      这可能更适合作为评论,但我没有那么多声誉。
      在我的例子中,income 变量是int,其值为c(1:7, 9)。其中,“9”代表“不想回答”。

      ## when all int should be fctr 
      New_data <- data %>% mutate_if(is.integer, as.factor)  %>% 
      mutate(income = fct_recode(income, NULL = "9"))
      

      我也试过recode(),还是不行。

      【讨论】:

        猜你喜欢
        • 2017-12-26
        • 1970-01-01
        • 1970-01-01
        • 2021-10-25
        • 2016-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多