Перекодирование переменной двойным условным выражением в dplyr с использованием mutate и case_when - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь исправить ошибки, допущенные в полевых условиях, когда полевые работники наблюдали, какие породы деревьев (SORTNR) были посажены в каких местах (Siteid). К сожалению, ошибки, которые были сделаны, не одинаковы для разных сайтов.

То, что я пытаюсь выразить в своем коде: когда Siteid и SORTNR представляют собой конкретную комбинацию, замените SORTNR на правильное значение. Однако, когда я затем проверяю данные, все SORTNR являются NA.

Если я разбиваю его и запускаю только один из блоков перекодирования, создается впечатление, что переменная SORTNR для комбинаций, не включенных в вызов, установлена ​​в NA, и что запуск обоих блоков приведет ко всем комбинациямбыть установленным на NA.

Как предотвратить изменение не упомянутых комбинаций на NA? Можем ли мы сделать ненужным явное заявление о том, что я хочу заменить правильные значения на себя?

Пример данных:

Siteid <- c(rep("F410", 10), "F411","F411","F411","F411","F411")
SORTNR <- c(1,2,4,5,8,9,10,11,12,2,12,14,28,15,12)
Dataframe <- data.frame(cbind(Siteid,SORTNR))

Запись

#Recoding Block 1
Dataframe <- Dataframe %>% mutate(SORTNR=case_when(
  Siteid=="F410" & SORTNR==1~2,
  Siteid=="F410" & SORTNR==2~2,
  Siteid=="F410" & SORTNR==4~28,
  Siteid=="F410" & SORTNR==5~28,
  Siteid=="F410" & SORTNR==8~28,
  Siteid=="F410" & SORTNR==9~28,
  Siteid=="F410" & SORTNR==10~27,
  Siteid=="F410" & SORTNR==11~28,
  Siteid=="F410" & SORTNR==12~28))

#Recoding Block 2
Dataframe <- Dataframe %>% mutate(SORTNR=case_when(
 Siteid=="F411" & SORTNR==12~13,
 Siteid=="F411" & SORTNR==28~29,
 Siteid=="F411" & SORTNR==14~14,
 Siteid=="F411" & SORTNR==15~15

1 Ответ

0 голосов
/ 11 октября 2019

Значения, которые не совпадают в операторе case_when(), присваиваются NA, поэтому вам нужно использовать TRUE ~ SORTNR в качестве конечного условия, чтобы избежать этого.

library(dplyr)

Dataframe %>%
  mutate(SORTNR = case_when(Siteid=="F410" & SORTNR %in% c(1,2) ~ 2,
                            Siteid=="F410" & SORTNR %in% c(4,5,8,9,11,12) ~ 28,
                            Siteid=="F410" & SORTNR == 10 ~ 27,
                            Siteid=="F411" & SORTNR == 12 ~ 13,
                            Siteid=="F411" & SORTNR == 28 ~ 29,
                            Siteid=="F411" & SORTNR == 14 ~ 14,
                            Siteid=="F411" & SORTNR == 15 ~ 15,
                            TRUE ~ SORTNR))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...