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

标签 r replace tidyverse data-cleaning dplyr

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

最佳答案

由于 'badbands' 的 length 大于 1,因此使用 %in% 而不是 ==,也是 case_when 是类型敏感的,因此最好使用正确的 NA,即 double 列的 NA_real_

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

关于使用 tidyverse 根据不同的列或行位置用 NA 替换列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50753731/

相关文章:

r - 具有缺失值的基 R 中的数据集

r - 动态规范化组中第一个元素的所有行

r - 绘制 Gamma 概率密度函数

R - install_github 失败

c - 使用动态分配的内存替换字符串

regex - 如何在 Sublime-Text2 中的每个非 ascii 单词前添加换行符?

linux - 查找、替换或插入 - 命令行

r - 将数据帧拆分为包含一对的较小数据帧列表

r - 一种通过特定条件在主题重复测量中进行过滤的简洁方法?

r - 使图例不可见,但保持图形尺寸和边距相同