Изменить значения столбцов в зависимости от других столбцов - PullRequest
0 голосов
/ 02 марта 2020

Мой набор данных содержит значения NDVI и значения NDVI-QualityDescriptor (PixelQa) для разных областей в разные даты. Я в основном хочу стереть (установив в NA) значения NDVI, связанные с дескриптором плохого качества (PixelQa). Числовой суффикс имен столбцов относится к обоим данным: PixelQa_1 относится к NDVI_1 и т. Д.

Поэтому для «очистки» моих данных мне необходимо проверить значения PixelQa, чтобы оценить, нужно ли мне изменять связанные с ними данные. Значение NDVI. Существует 3 возможных ситуации:

  1. PixelQa равен NA -> тогда NDVI должен быть также NA.
  2. Пиксель Qa равен 66 ± 0,5 ИЛИ 130 ± 0,5 -> тогда NDVI остается тем же значением.
  3. Пиксель Qa отличается от 66 ± 0,5 ИЛИ 130 ± 0,5 -> тогда значение NDVI устанавливается равным NA (это данные плохого качества, которые необходимо игнорировать).

Мой набор данных может быть:

DataNDVI_split <- data.frame("21feb1987_NDVI" = c(0.123, NA, 0.192, 0.234, NA), "21feb1987_PixelQa" = c(66.30, NA, 66.00, 79.87, NA), "18jul1987_NDVI" = c(0.223, NA, 0.230, 0.334, NA), "21feb1987_PixelQa" = c(66.30, NA, 66.00, 79.87, NA), stringsAsFactors = FALSE)
DataNDVI_split
  X21feb1987_NDVI1 X21feb1987_PixelQa1 X18jul1987_NDVI2 X21feb1987_PixelQa2
1           0.123              66.30           0.223                66.30
2              NA                 NA              NA                   NA
3           0.192              66.00           0.230                66.00
4           0.234              79.87           0.334                79.87
5              NA                 NA              NA                   NA

И «чистый» должен выглядеть так:

DataNDVI_split <- data.frame("21feb1987_NDVI" = c(0.123, NA, 0.192, 0.234, NA), "21feb1987_PixelQa" = c(66.30, NA, 66.00, 79.87, NA), "18jul1987_NDVI" = c(0.223, NA, 0.230, 0.334, NA), "21feb1987_PixelQa" = c(66.30, NA, 66.00, 79.87, NA), stringsAsFactors = FALSE)
DataNDVI_split
  X21feb1987_NDVI1 X21feb1987_PixelQa1 X18jul1987_NDVI2 X21feb1987_PixelQa2
1           0.123              66.30           0.223                66.30
2              NA                 NA              NA                   NA
3           0.192              66.00           0.230                66.00
4              NA              79.87              NA                79.87
5              NA                 NA              NA                   NA

1 Ответ

0 голосов
/ 02 марта 2020

Вот примерное решение. Во-первых, я бы разделил данные на два отдельных кадра данных, таким образом:

df_ndvi <- DataNDVI[grepl("NDVI", DataNDVI$Data), ]
df_ndvi
   Data X21feb1987 X18jul1987
1 NDVI1      0.123      0.223
2 NDVI2         NA         NA
3 NDVI3      0.192      0.230
4 NDVI4      0.234      0.334
5 NDVI5         NA         NA

df_pixel <- DataNDVI[!grepl("NDVI", DataNDVI$Data), ]
df_pixel
       Data X21feb1987 X18jul1987
6  PixelQa1      66.30      66.00
7  PixelQa2         NA         NA
8  PixelQa3      66.00     124.23
9  PixelQa4      79.87      86.00
10 PixelQa5         NA         NA

Для внесения желаемых изменений существует множество возможных способов. Одним из способов является использование for l oop через все столбцы в df_ndvi (кроме первого!) И определение оператора ifelse, чтобы увидеть, выполняются ли условия или нет, и определить действия, которые необходимо предпринять в любом случае:

for(i in 2:3){
  df_ndvi[,i] <- ifelse(df_pixel[,i] < 65.5 | df_pixel[,i] > 66.5, NA, df_ndvi[,i])
}

Это приводит к следующим исправлениям в df_ndvi:

df_ndvi
   Data X21feb1987 X18jul1987
1 NDVI1      0.123      0.223
2 NDVI2         NA         NA
3 NDVI3      0.192         NA
4 NDVI4         NA         NA
5 NDVI5         NA         NA

РЕДАКТИРОВАТЬ :

Если вы предпочитаете разделите данные следующим образом:

DataNDVI_split <- data.frame("21feb1987_NDVI" = c(0.123, NA, 0.192, 0.234, NA), "21feb1987_PixelQa" = c(66.30, NA, 66.00, 79.87, NA), "18jul1987_NDVI" = c(0.223, NA, 0.230, 0.334, NA), "21feb1987_PixelQa" = c(66.30, NA, 66.00, 79.87, NA), stringsAsFactors = FALSE)
DataNDVI_split
  X21feb1987_NDVI X21feb1987_PixelQa X18jul1987_NDVI X21feb1987_PixelQa.1
1           0.123              66.30           0.223                66.30
2              NA                 NA              NA                   NA
3           0.192              66.00           0.230                66.00
4           0.234              79.87           0.334                79.87
5              NA                 NA              NA                   NA

, тогда for l oop можно адаптировать следующим образом:

for(i in c(1,3)){
  DataNDVI_split[,i] <- ifelse(DataNDVI_split[,i+1] < 65.5 | DataNDVI_split[,i+1] > 66.5, NA, DataNDVI_split[,i])
}

Результат будет таким:

DataNDVI_split
  X21feb1987_NDVI X21feb1987_PixelQa X18jul1987_NDVI X21feb1987_PixelQa.1
1           0.123              66.30           0.223                66.30
2              NA                 NA              NA                   NA
3           0.192              66.00           0.230                66.00
4              NA              79.87              NA                79.87
5              NA                 NA              NA                   NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...