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"))