使用 Forcats 和 Dplyr 创建函数以重新编码多个满意度量表变量
Creating a Function using Forcats and Dplyr to Recode Multiple Satisfaction Scale Variables
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 函数中使用 "contains" 或 "matches" 之类的东西来查找包含 "Sat" 或 "sat" 的所有类别重新编码,"Dis" 或 "dis" 用于不满意类别,"Neutral" 或 "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")))))))
}
问题是使用因素,你不能解释不同的拼写:每个拼写会有不同的级别。
您可以使用 stringsAsFactors = FALSE
或 data_frame
制作数据框,后者不会将字符串强制转换为避免这种情况的因素。
如果我理解你的问题,你想重新编码因素,名称中会有拼写错误。我将假设第一个字符是一个给出预期因子的数字,不管后面是什么。
使用 stringr::str_sub
,我将提取该数字并使用它来映射 fct_collapse,如您所愿。
注意:我添加了一个级别“3”,它没有出现在您的类别和级别之间的映射中,并假设它是"Satisfied"。
我还使用 dplyr::starts_with
到 select 只有您想要更改的列。
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
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 函数中使用 "contains" 或 "matches" 之类的东西来查找包含 "Sat" 或 "sat" 的所有类别重新编码,"Dis" 或 "dis" 用于不满意类别,"Neutral" 或 "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")))))))
}
问题是使用因素,你不能解释不同的拼写:每个拼写会有不同的级别。
您可以使用 stringsAsFactors = FALSE
或 data_frame
制作数据框,后者不会将字符串强制转换为避免这种情况的因素。
如果我理解你的问题,你想重新编码因素,名称中会有拼写错误。我将假设第一个字符是一个给出预期因子的数字,不管后面是什么。
使用 stringr::str_sub
,我将提取该数字并使用它来映射 fct_collapse,如您所愿。
注意:我添加了一个级别“3”,它没有出现在您的类别和级别之间的映射中,并假设它是"Satisfied"。
我还使用 dplyr::starts_with
到 select 只有您想要更改的列。
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