library(dplyr)
library(forcats)
Below is a simple dataframe containing three columns that need to be recoded into three categories - Satisfied, Dissatisfied, Neutral.
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)
I would like to use dplyr and forcats for the recoding. An example is below.
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")))
I need a function since I'll be doing this for multiple files. The function has to accommodate multiple variables as inputs and accommodate differences in spelling and punctuation for the different satisfaction categories. For example, "1 Extremely dissatisfied", or "1. Extremely dissatisfied", or "1 Extremely Dissatisfied", etc.
Below is an example function, but I'm not sure how to allow for a non-fixed number of "Var" variables (I would like to use the dots, ..., but had trouble making it work), as well as how to use something like "contains" or "matches" within the fct_collapse function to find all categories containing "Sat" or "sat" for the Satisfied recode, and "Dis" or "dis" for the Dissatisfaction category, and "Neutral" or "neutral" for the Neutral category.
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")))
}
or something like this...
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")))))))
}