Замените значения столбца на NA, основанные на другой позиции столбца или строки, с помощью Tidyverse - PullRequest
0 голосов
/ 08 июня 2018

Ниже приведена уменьшенная версия гораздо большего тибля, который у меня есть, и я хочу заменить значения в refleanceSfp и refleanceDT на NA на основе значений в столбце bandNumber или на основе их положения в строке.Я хотел бы решить эту проблему специально с помощью tidyverse pipe и связанных пакетов.

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

Ответы [ 3 ]

0 голосов
/ 08 июня 2018
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.
0 голосов
/ 08 июня 2018
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.
0 голосов
/ 08 июня 2018

Поскольку у '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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...