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