Функция для перекодирования нескольких переменных шкалы удовлетворенности со стандартной оценкой, 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, я открыт для использования других функций / методов для достижения той же конечной цели, предпочтительно в пределах tidyverse.


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


Ответы (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
person FlorianGD    schedule 02.03.2017