【问题标题】:Replace column values with NA based on a different column or row position with tidyverse使用 tidyverse 根据不同的列或行位置将列值替换为 NA
【发布时间】:2018-11-18 02:33:56
【问题描述】:

下面是我拥有的更大 tibble 的较小版本,我想根据 bandNumber 列中的值或基于它们的行位置将 reflectanceSfp 和 reflectanceDT 中的值替换为 NA。我想专门用 tidyverse 管道和相关包来解决这个问题。

 reflectanceSfp wavelength bandNumber reflectanceDT wavelength1
     -0.0113          376       1.00      0.000148         377
     -0.000592        381       2.00      0.00589          382
      0.0158          386       3.00      0.0101           387
      0.0200          391       4.00      0.0110           392
      0.0240          396       5.00      0.0117           397
      0.0265          401       6.00      0.0149           402

所以我有以下坏波段列表,这些是我想用 NA 替换的波段编号:

badBands <- c(1:2,6)

我已经尝试过这种格式的东西,只是想看看它会做什么

m2 <- myData %>%
  mutate(reflectanceSfp = case_when(bandNumber == 1.00 ~ NA ))

但是,最终会希望坏带向量在管道中 并尝试了解 modify_at 和 mutate_at 的使用。

我希望生成的数据集看起来像

 reflectanceSfp wavelength bandNumber reflectanceDT wavelength1
          NA          376       1.00      0.000148         377
          NA          381       2.00      0.00589          382
      0.0158          386       3.00      0.0101           387
      0.0200          391       4.00      0.0110           392
      0.0240          396       5.00      0.0117           397
          NA          401       6.00      0.0149           402

下面是我的表格的 dput 版本:

myData <- structure(list(reflectanceSfp = c(-0.011258, -0.000592, 0.015815, 
0.019991, 0.023965, 0.026547), wavelength = c(376.440002, 381.450012, 
386.459991, 391.470001, 396.470001, 401.480011), bandNumber = c(1, 
2, 3, 4, 5, 6), reflectanceDT = c(0.00014819, 0.00589207, 0.01012335, 
0.01101705, 0.01165185, 0.01486412), wavelength1 = c(376.6300049, 
381.6400147, 386.6499939, 391.6600037, 396.6600037, 401.6700134
)), .Names = c("reflectanceSfp", "wavelength", "bandNumber", 
"reflectanceDT", "wavelength1"), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

【问题讨论】:

    标签: r replace tidyverse data-cleaning dplyr


    【解决方案1】:

    由于'badBands'的length大于1,使用%in%而不是==,而且case_when是类型敏感的,所以最好有正确的NA,即NA_real_对于double

    myData %>% 
        mutate(reflectanceSfp = case_when(bandNumber %in% badBands ~ NA_real_, 
                                       TRUE ~ reflectanceSfp))
    # A tibble: 6 x 5
    #  reflectanceSfp wavelength bandNumber reflectanceDT wavelength1
    #           <dbl>      <dbl>      <dbl>         <dbl>       <dbl>
    #1        NA            376.          1      0.000148        377.
    #2        NA            381.          2      0.00589         382.
    #3         0.0158       386.          3      0.0101          387.
    #4         0.0200       391.          4      0.0110          392.
    #5         0.0240       396.          5      0.0117          397.
    #6        NA            401.          6      0.0149          402.
    

    或者这里更容易使用replace,我们只需要指定满足逻辑条件的替换值,不需要类型检查

    myData %>%
          mutate(reflectanceSfp = replace(reflectanceSfp, 
                                     bandNumber %in% badBands, NA))
    

    【讨论】:

    • myData %&gt;% mutate(reflectanceSfp = replace(reflectanceSfp, badBands, NA))
    • @Onyambu 仅当它是数字索引并且也是行索引时才有效
    • 很好..我现在明白了
    【解决方案2】:
    myData %>% 
      mutate(reflectanceSfp = ifelse(bandNumber %in% badBands, NA, reflectanceSfp))
    
    # A tibble: 6 x 5
      reflectanceSfp wavelength bandNumber reflectanceDT wavelength1
               <dbl>      <dbl>      <dbl>         <dbl>       <dbl>
    1        NA            376.         1.      0.000148        377.
    2        NA            381.         2.      0.00589         382.
    3         0.0158       386.         3.      0.0101          387.
    4         0.0200       391.         4.      0.0110          392.
    5         0.0240       396.         5.      0.0117          397.
    6        NA            401.         6.      0.0149          402.
    

    【讨论】:

      【解决方案3】:
      myData%>%
          mutate(reflectanceSfp=`is.na<-`(reflectanceSfp,badBands))
      # A tibble: 6 x 5
        reflectanceSfp wavelength bandNumber reflectanceDT wavelength1
                 <dbl>      <dbl>      <dbl>         <dbl>       <dbl>
      1        NA            376.         1.      0.000148        377.
      2        NA            381.         2.      0.00589         382.
      3         0.0158       386.         3.      0.0101          387.
      4         0.0200       391.         4.      0.0110          392.
      5         0.0240       396.         5.      0.0117          397.
      6        NA            401.         6.      0.0149          402.
      

      【讨论】:

      • 另一个选项with(myData, reflectanceSfp* NA^(bandNumber %in% badBands))
      猜你喜欢
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多