使用 tidyverse 根据不同的列或行位置用 NA 替换列值

Replace column values with NA based on a different column or row position with tidyverse

下面是我拥有的更大的 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

下面是我的 table 的输出版本:

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"))

由于 'badBands' 的 length 大于 1,所以使用 %in% 而不是 ==,而且 case_when 是类型敏感的,所以它是最好有正确的 NANA_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 %>% 
  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.
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.