【问题标题】:Replace specific values with NA for specific columns用 NA 替换特定列的特定值
【发布时间】:2020-10-25 16:23:17
【问题描述】:

我有一个包含二进制 (0/1) 项的大数据框。但是有些列包含 3。我想为某些列更改这 3 个 NA 并将更改应用于原始数据框。

我尝试了一些解决方案,但它们要么应用于整个数据集,要么创建一个仅包含更改列的新数据集。

数据集的头部看起来像:

                          X1  X2  X3  X4  X5  X6
                      S1  1   45  0   1   1    3
                      S2  2   12  1   0   3    0
                      S3  3   3   0   0   1    1
                      S4  4   11  1   0   3    3
                      S5  5   13  0   1   1    3
                      S6  6   20  1   0   1    1                           

期望的输出:

                          X1  X2  X3  X4  X5  X6
                      S1  1   45  0   1   1    NA
                      S2  2   12  1   0   NA   0
                      S3  3   3   0   0   1    1
                      S4  4   11  1   0   NA   NA
                      S5  5   13  0   1   1    NA
                      S6  6   20  1   0   1    1    

谢谢:)

【问题讨论】:

    标签: r replace na


    【解决方案1】:

    您可以使用dplyr 来做到这一点。

    这里是友好的dput的数据。

    data <- structure(list(X1 = c(1, 2, 3, 4, 5, 6), 
               X2 = c(45, 12, 3, 11, 13, 20), 
               X3 = c(0, 1, 0, 1, 0, 1), 
               X4 = c(1, 0, 0, 0, 1, 0), 
               X5 = c(1, 3, 1, 3, 1, 1), 
               X6 = c(3, 0, 1, 3, 3, 1)), 
          class = "data.frame", 
          row.names = c("S1", "S2", "S3", "S4", "S5", "S6"))
    
    library(dplyr)
    data %>% 
      mutate(across(X3:X6, ~na_if(., 3)))
    
      X1 X2 X3 X4 X5 X6
    1  1 45  0  1  1 NA
    2  2 12  1  0 NA  0
    3  3  3  0  0  1  1
    4  4 11  1  0 NA NA
    5  5 13  0  1  1 NA
    6  6 20  1  0  1  1
    

    【讨论】:

    • 这很好,只是我必须将它分配给新的数据框,干杯:)
    【解决方案2】:

    尝试使用dplyr 使用across()

    library(dplyr)
    #Code
    df <- df %>% rowwise() %>% mutate(across(X5:X6,~ifelse(.==3,NA,.)))
    

    输出:

    # A tibble: 6 x 6
    # Rowwise: 
         X1    X2    X3    X4    X5    X6
      <int> <int> <int> <int> <int> <int>
    1     1    45     0     1     1    NA
    2     2    12     1     0    NA     0
    3     3     3     0     0     1     1
    4     4    11     1     0    NA    NA
    5     5    13     0     1     1    NA
    6     6    20     1     0     1     1
    

    【讨论】:

    • 谢谢鸭子,因为我有这么多列,可以使用列号吗?像 [, 3:64] 61 列?最好的
    • @MudarSaied 是的,只需在代码中更改它across(c(3:64),~ifelse(.==3,NA,.))
    【解决方案3】:

    base R,我们可以做

    data[3:6][data[3:6] == 3] <- NA
    

    -输出

    data
    #   X1 X2 X3 X4 X5 X6
    #S1  1 45  0  1  1 NA
    #S2  2 12  1  0 NA  0
    #S3  3  3  0  0  1  1
    #S4  4 11  1  0 NA NA
    #S5  5 13  0  1  1 NA
    #S6  6 20  1  0  1  1
    

    注意:使用base R 也会保留行名

    数据

    data <- structure(list(X1 = c(1, 2, 3, 4, 5, 6), X2 = c(45, 12, 3, 11, 
    13, 20), X3 = c(0, 1, 0, 1, 0, 1), X4 = c(1, 0, 0, 0, 1, 0), 
        X5 = c(1, 3, 1, 3, 1, 1), X6 = c(3, 0, 1, 3, 3, 1)),
        class = "data.frame", row.names = c("S1", 
    "S2", "S3", "S4", "S5", "S6"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      • 2017-12-19
      • 2020-06-18
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多