【问题标题】:Replace NA in a series of variables by a factor level用因子水平替换一系列变量中的 NA
【发布时间】:2021-03-13 00:56:30
【问题描述】:

这是我的数据,我想将NA 替换为“否”。我可以一一替换缺失值。但是,我需要替换代码中的s_1:s_4 中的NAs。提醒一下,所有变量都是因子水平。

id  x   s_0 s_1 s_2 s_3
1   5   75  A   4   110
2   9   36  NA  NA  921
3   11  13  B   7   769
4   11  34  C   2   912
5   11  NA  C   NA  835
6   13  39  NA  4   NA
7   14  45  B   4   577
8   19  42  D   6   NA
9   20  4   NA  7   577
10  13  28  NA  3   573 

【问题讨论】:

    标签: r dplyr datatable missing-data imputation


    【解决方案1】:

    如果这些是已经存在的因素,你可以使用forcats::fct_explicit_na()

    library(dplyr)
    library(forcats)
    
    # Make sample data vars factors
    dat <- dat %>%
      mutate(across(starts_with("s_"), as.factor))
    
    # Add 'No' as factor level
    dat %>%
      mutate(across(starts_with("s_"), fct_explicit_na, "No"))
    
    # A tibble: 10 x 6
          id     x s_0   s_1   s_2   s_3  
       <dbl> <dbl> <fct> <fct> <fct> <fct>
     1     1     5 75    A     4     110  
     2     2     9 36    No    No    921  
     3     3    11 13    B     7     769  
     4     4    11 34    C     2     912  
     5     5    11 No    C     No    835  
     6     6    13 39    No    4     No   
     7     7    14 45    B     4     577  
     8     8    19 42    D     6     No   
     9     9    20 4     No    7     577  
    10    10    13 28    No    3     573  
    

    【讨论】:

    【解决方案2】:

    在基础 R 中,您需要在将 NA 转换为 "No" 之前将 "No" 作为因子水平。

    cols <- grep('s_\\d+', names(df))
    
    df[cols] <- lapply(df[cols], function(x) {
      levels(x) <- c(levels(x), 'No')
      x[is.na(x)] <- 'No'
      x
    })
    
    df
    #   id  x s_0 s_1 s_2 s_3
    #1   1  5  75   A   4 110
    #2   2  9  36  No  No 921
    #3   3 11  13   B   7 769
    #4   4 11  34   C   2 912
    #5   5 11  No   C  No 835
    #6   6 13  39  No   4  No
    #7   7 14  45   B   4 577
    #8   8 19  42   D   6  No
    #9   9 20   4  No   7 577
    #10 10 13  28  No   3 573
    

    【讨论】:

      猜你喜欢
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      • 2016-12-31
      • 1970-01-01
      相关资源
      最近更新 更多