Tidyverse - интеграция mutate select и случай, когда нужно масштабировать

Я - пользователь Tidyverse, и мне трудно выполнить простую команду.

У меня есть набор данных, где некоторые переменные являются шкалами Лайкерта, и теперь я хочу назначить некоторые текстовые метки для этого конкретного набора переменных. Для этого я предполагаю, что лучший процесс включает в себя мутирование, затем выберите, какие переменные я хочу изменить, и затем скажите R, какие будут новые значения.

Это кажется логикой для меня. Однако между тем, что я хочу сделать, и R-кодом, который я создаю, есть мост.

Я надеюсь, что кто-то может помочь мне решить этот вопрос.

Код ниже является воспроизводимым примером:

library(tidyverse)
ds <- data.frame(sex=c(0,1), age=rnorm(n = 100, mean = 7, sd=2),
                 question1_1 = sample(1:5),
                 question1_2 = sample(1:5),
                 question1_3 = sample(1:5),
                 question1_4 = sample(1:5),
                 question1_5 = sample(1:5))
ds <- ds %>% mutate(
  select %>% starts_with("question1_") %>% 
  case_when(. == 1 ~ "Strongly disagree",
            . == 2 ~ "Disagree",
            . == 3 ~ "Neutral",
            . == 4 ~ "Agree",
            . == 5 ~ "Strongly agree"))

Я не нашел ни одного предыдущего сообщения, задающего тот же вопрос, и поэтому я создаю эту новую тему. Пожалуйста, дайте мне знать, если это сообщение является дубликатом, чтобы исключить его.

Большое спасибо.

2 ответа

Мы могли бы использовать его в mutate_at

ds %>%
   mutate_at(vars(starts_with('question')), 
         funs(case_when(.==1 ~ "Strongly disagree",
                        .==2 ~ "Disagree",
                        .==3 ~ "Neutral",
                        .==4 ~ "Agree",
                        .==5 ~ "Strongly agree")))

Но это можно упростить, так как значения являются целыми числами, поэтому передайте vector строк в том же порядке, мы хотим изменить, используя целочисленные значения в качестве индексов

v1 <- c('Strongly disagree', 'Disagree', 'Neutral', 'Agree', 'Strongly agree')
ds %>%
   mutate_at(vars(starts_with('question')),
         funs(v1[.]))

Вы также можете использовать факторы:

library(tidyverse)
ds %>%
  mutate_at(vars(starts_with('question')), factor, 
                 labels= c("Strongly disagree","Disagree","Neutral","Agree", "Strongly agree")) %>%
  head

#   sex      age       question1_1       question1_2       question1_3       question1_4       question1_5
# 1   0 6.518414             Agree           Neutral          Disagree           Neutral             Agree
# 2   1 4.972210           Neutral          Disagree    Strongly agree Strongly disagree Strongly disagree
# 3   0 6.422792 Strongly disagree    Strongly agree             Agree          Disagree    Strongly agree
# 4   1 9.839967          Disagree             Agree           Neutral    Strongly agree           Neutral
# 5   0 7.518809    Strongly agree Strongly disagree Strongly disagree             Agree          Disagree
# 6   1 8.446730             Agree           Neutral          Disagree           Neutral             Agree

Переведено в базу R:

cols_lgl <- startsWith(names(ds),"question")
ds[cols_lgl] <- lapply(ds[cols_lgl],factor, labels= c("Strongly disagree","Disagree","Neutral","Agree", "Strongly agree"))
Другие вопросы по тегам