Создание функции с использованием Forcats и Dplyr для перекодирования нескольких переменных шкалы удовлетворенности

library(dplyr)
library(forcats)

Ниже приведен простой фрейм данных, содержащий три столбца, которые необходимо перекодировать в три категории - удовлетворено, неудовлетворено, нейтрально.

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)

Я хотел бы использовать dplyr и forcats для перекодирования. Пример ниже.

REC<-df%>%mutate_at(vars(Sat1:Sat3),funs(Rec=fct_collapse(.,
Satisfied=c("7 Extremely satisfied","6 Moderately satisfied","5 Slightly Satisfied"),
Dissatisfied=c("2 Moderately dissatisfied","1 Extremely dissatisfied"),
Neutral="4 Neutral")))

Мне нужна функция, поскольку я буду делать это для нескольких файлов. Функция должна учитывать несколько переменных в качестве входных данных и учитывать различия в орфографии и пунктуации для разных категорий удовлетворенности. Например, «1 крайне недоволен», или «1. крайне не удовлетворен», или «1 крайне не удовлетворен» и т. Д.

Ниже приведен пример функции, но я не уверен, как разрешить нефиксированное количество переменных «Var» (я хотел бы использовать точки, ..., но у меня возникли проблемы с их работой), а также как использовать что-то вроде "содержит" или "соответствует" в функции fct_collapse, чтобы найти все категории, содержащие "Sat" или "Sat" для перекодировки удовлетворенных, и "Dis" или "dis" для категории неудовлетворенности и "Neutral" или «нейтральный» для нейтральной категории.

REC<-function(df,Var){    
df%>%mutate_at(vars(Var),funs(Rec=fct_collapse(.,
Satisfied=c("7 Extremely satisfied","6 Moderately satisfied","5 Slightly Satisfied"),
Dissatisfied=c("2 Moderately dissatisfied","1 Extremely dissatisfied"),
Neutral="4 Neutral")))
}

или что-то в этом роде ...

Recode<-function(Df,Var,...){
Df%>%mutate_at(vars(Var),funs(Rec=fct_collapse(.,
Satisfied=c(select(matches("Sat|sat"),
Dissatisfied=c(select(matches("Dis"|"dis"),
Neutral="4 Neutral")))))))
}

person Mike    schedule 28.02.2017    source источник


Ответы (1)


Проблема в том, что, используя факторы, вы не можете учесть разное написание: для каждого написания будут разные уровни. Вы можете создать фрейм данных с stringsAsFactors = FALSE или с data_frame, который не приводит строки к факторам, чтобы этого избежать.

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

Используя stringr::str_sub, я извлечу это число и использую его для сопоставления fct_collapse, как вы хотели. Примечание: я добавил уровень «3», который не отображается в вашем сопоставлении между вашими категориями и уровнями, и предположил, что он был «Удовлетворен». Я также использую dplyr::starts_with для выбора только столбцов, которые вы хотите изменить.

df <- data_frame(Respondent,Sat1,Sat2,Sat3,Pet)
library(stringr)

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

Вот результат:

# 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
person FlorianGD    schedule 28.02.2017
comment
Несколько вопросов, я надеялся, что это будет как функция, следует ли мне создать еще один вопрос? Мне нужна функция, чтобы иметь возможность принимать несколько переменных для перекодирования, но я не уверен, сколько их, поэтому я думаю, что мне нужно использовать аргумент типа SE .dots с ...? - person Mike; 28.02.2017
comment
REC ‹-функция (D, ...) {D%›% mutate_at (vars (...), funs (fct_collapse (str_sub (., 1, 1), levels = as.character (1: 7)), Доволен = c (7,6,5), Недоволен = c (3,2,1), Нейтрально = 4))} - person Mike; 28.02.2017
comment
Для vars (start_with (Sat)) я думаю что-то вроде кода в комментарии выше, поскольку будет несколько имен столбцов, и каждый файл будет иметь разное количество столбцов, и они могут не начинаться с Sat ... поэтому я думаю, что функция будет лучшей, поэтому я могу просто ввести разные имена столбцов в функцию и перекодировать их все аналогичным образом ... - person Mike; 28.02.2017
comment
Привет, я создал еще один вопрос на основе моих комментариев выше, если вы снова хотите мне помочь. Он называется - Функция перекодирования нескольких переменных шкалы удовлетворенности со стандартной оценкой, Forcats и Stringr. - person Mike; 01.03.2017