Нам не нужно recode
здесь.Просто преобразуйте логическое выражение в двоичное с помощью as.integer
.Значения TRUE изменяются на 1, а другие на 0, в то время как элементы NA
в исходных данных остаются неизменными.
data %>%
mutate(CESD = (CESD >= 16 & !is.na(CESD)) * NA^(is.na(CESD)))
Или с использованием только base R
data$CESD <- with(data, (CESD >= 16 & !is.na(CESD)) * NA^(is.na(CESD))))
Или мы создаем логическое выражение для NA
элементов и обновляем только для не-NA элементов
i1 <- !is.na(data$CESD)
data$CESD[i1] <- as.integer(data$CESD[i1] >= 16)
, которые можно записать более компактно с помощью data.table
library(data.table)
setDT(data)[!is.na(CESD), CESD := as.integer(CESD >= 16)]
ПРИМЕЧАНИЕ. Если значения должны соответствовать классу character
, оберните его as.character
data
set.seed(24)
data <- data.frame(CESD = sample(c(NA, 1:5, 15:20), 50, replace = TRUE),
col2 = rnorm(50))