使用 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
是类型敏感的,所以它是最好有正确的 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 %>%
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.
下面是我拥有的更大的 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
是类型敏感的,所以它是最好有正确的 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 %>%
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.