Функция перекодирования нескольких переменных шкалы удовлетворенности со стандартными оценками, Forcats и Stringr
library(tidyverse)
library(stringr)
library(lazyeval)
Ниже приведены данные для простого примера с фреймом данных...
Respondent<-c("Respondent1","Respondent2","Respondent3","Respondent4","Respondent5")
Sat1<-c("1 Extremely dissatisfied","2 Moderately dissatisfied","2 Moderately Dissatisfied","4 Neutral","7 Extrmely satified")
Sat2<-c("7 Extremely Satisfied","2. Moderately dissatisfied","4 Neutral","3 Slightly dissatisfied","3 Slightly Dissatisfied")
Sat3<-c("1 Extremely dissatisfied","7 Extremely satisfied","6 Moderately satisfied","4. Neutral","3 Slightly dissatisfied")
Pet<-c("Cat","Cat","Dog","Hamster","Rabbit")
df <- data_frame(Respondent,Sat1,Sat2,Sat3,Pet)
Код ниже должен перекодировать столбцы оценки удовлетворенности в три категории удовлетворенных, неудовлетворенных и нейтральных.
df %>%
mutate_at(vars(starts_with("Sat")),
funs(fct_collapse(factor(str_sub(., 1, 1), levels = as.character(1:7)),
Satisfied = c("7","6","5"),
Dissatisfied =c ("3", "2","1"),
Neutral = "4")))
Однако мой реальный пример включает в себя перекодирование одной и той же шкалы удовлетворенности для нескольких файлов, каждый из которых имеет разное количество столбцов шкалы удовлетворенности. Поэтому я хотел бы обернуть это в функцию, которая позволит мне вводить имя фрейма данных, а также любое количество столбцов для перекодирования. Ниже приведен один из вариантов кода, который я пытаюсь использовать, но не могу заставить его работать. Я играл с.dots и "...", но не смог найти ничего подходящего.
REC<-function(data,...){
data %>%
mutate_at(vars(...),
funs(fct_collapse(factor(str_sub(., 1, 1), levels = as.character(1:7)),
Satisfied = c("7","6","5"),
Dissatisfied =c ("3", "2","1"),
Neutral = "4")))
}
Должен ли я использовать стандартную оценку с mutate_at? Кроме того, я должен использовать.dots с...? Если стандартная оценка не работает с mutate_at, я открыт для использования других функций / методов для достижения той же конечной цели, предпочтительно в рамках тидиверса.
1 ответ
Есть ли starts_with("Sat")
работать для всех ваших файлов? В этом случае функция будет работать независимо от количества столбцов, начинающихся с "Sat".
REC <- function(data){
data %>%
mutate_at(vars(starts_with("Sat")),
funs(fct_collapse(factor(str_sub(., 1, 1), levels = as.character(1:7)),
Satisfied=c("7","6","5"),
Dissatisfied=c("3", "2","1"),
Neutral="4")))
}
Если вы хотите передать индексы столбцов, которые вы хотите изменить, вы можете попробовать:
REC <- function(data, variable){
data %>%
mutate_at(vars(variable),
funs(fct_collapse(factor(str_sub(., 1, 1), levels = as.character(1:7)),
Satisfied=c("7","6","5"),
Dissatisfied=c("3", "2","1"),
Neutral="4")))
}
затем REC(df, 2:4)
даст вам этот вывод
# A tibble: 5 × 5
Respondent Sat1 Sat2 Sat3 Pet
<chr> <fctr> <fctr> <fctr> <chr>
1 Respondent1 Dissatisfied Satisfied Dissatisfied Cat
2 Respondent2 Dissatisfied Dissatisfied Satisfied Cat
3 Respondent3 Dissatisfied Neutral Satisfied Dog
4 Respondent4 Neutral Dissatisfied Neutral Hamster
5 Respondent5 Satisfied Dissatisfied Dissatisfied Rabbit