Изменить значения в переменной в кадре данных: ≥16 на «1», < 16 на «0»? - PullRequest
0 голосов
/ 29 сентября 2018

Если у меня есть фрейм данных data с переменной CESD, я хочу изменить значения ≥ 16 в CESD на «1» и < 16 на «0» (примечание: в этом есть NAvector и я надеюсь пренебречь ими), какую функцию R я могу использовать?

Я пробовал mutate() в пакете dplyr, но это не работает

library(tidyverse)
data = data %>%
  mutate(CESD = recode(CESD, `1` = CESD[CESD >= 16 & !is.na(CESD)], `0` = CESD[CESD < 16 & !is.na(CESD)]))

сообщение возвращается в R: Ошибка в mutate_impl (.data, точки): ошибка оценки: вектор 1 должен быть длиной 419 или один, а не 88.

1 Ответ

0 голосов
/ 29 сентября 2018

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