Подтвердить что ты не робот

Устранение конфликтов типа с dplyr:: case_when

Я пытаюсь использовать dplyr::case_when внутри dplyr::mutate, чтобы создать новую переменную, в которой я установил некоторые значения в отсутствие и перекодировал другие значения одновременно.

Однако, если я пытаюсь установить значения NA, я получаю сообщение об ошибке, говорящее, что мы не можем создать переменную new, потому что NA являются логическими:

Ошибка в файле mutate_impl (.data, точки):
  Ошибка оценки: должен быть тип double, а не логический.

Есть ли способ установить значения NA в нелогичном векторе в кадре данных, используя это?

library(dplyr)    

# Create data
df <- data.frame(old = 1:3)

# Create new variable
df <- df %>% dplyr::mutate(new = dplyr::case_when(old == 1 ~ 5,
                                                  old == 2 ~ NA,
                                                  TRUE ~ old))

# Desired output
c(5, NA, 3)
4b9b3361

Ответ 1

Как сказано в ?case_when:

Все RHS должны оцениваться одним и тем же типом вектора.

У вас есть две возможности:

1) Создайте new как числовой вектор

df <- df %>% mutate(new = case_when(old == 1 ~ 5,
                                    old == 2 ~ NA_real_,
                                    TRUE ~ as.numeric(old)))

Обратите внимание, что NA_real_ - это числовая версия NA и что вы должны преобразовать old в числовой, потому что вы создали его как целое в исходном фрейме.

Вы получаете:

str(df)
# 'data.frame': 3 obs. of  2 variables:
# $ old: int  1 2 3
# $ new: num  5 NA 3

2) Создайте new как целочисленный вектор

df <- df %>% mutate(new = case_when(old == 1 ~ 5L,
                                    old == 2 ~ NA_integer_,
                                    TRUE ~ old))

Здесь 5L заставляет 5 в целочисленный тип, а NA_integer - целочисленная версия NA.

Итак, на этот раз new будет целое число:

str(df)
# 'data.frame': 3 obs. of  2 variables:
# $ old: int  1 2 3
# $ new: int  5 NA 3

Ответ 2

Попробуй?

df %>% dplyr::mutate(new = dplyr::case_when(.$old == 1 ~ 5,
                                                  .$old == 2 ~ NA_real_,
                                                  TRUE~.$old))

> df
  old new
1   1   5
2   2  NA
3   3   3