【问题标题】:Creating a Function using Forcats and Dplyr to Recode Multiple Satisfaction Scale Variables使用 Forcats 和 Dplyr 创建函数以重新编码多个满意度量表变量
【发布时间】:2017-02-28 03:43:12
【问题描述】:
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”用于不满意的类别,以及中性类别的“中性”或“中性”。

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

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    问题在于,使用因素,您无法解释不同的拼写:每个拼写都有不同的级别。 您可以使用stringsAsFactors = FALSEdata_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
    

    【讨论】:

    • 几个问题,我希望有这个功能,我应该创建另一个问题吗?我需要该函数能够对多个变量进行重新编码,但我不确定有多少,所以我认为我必须使用带有“...”的 SE .dots 类型参数?
    • REC%mutate_at(vars(...),funs(fct_collapse(str_sub(.,1, 1),levels=as.字符(1:7)),满意=c(“7”,“6”,“5”),不满意=c(“3”,“2”,“1”),中性=“4”))}
    • 对于 vars(starts_with("Sat")),我正在考虑类似于上面评论中的代码,因为会有多个列名,并且每个文件都有不同的列数而且它们可能不会以“Sat”开头...所以我认为该函数将是最好的,因此我可以在函数中输入不同的列名并将它们都以类似方式重新编码...
    • 嗨,如果您想再次帮助我,我根据上面的 cmets 创建了另一个问题。它的标题是 - 使用标准评估、Forcats 和 Stringr 重新编码多个满意度量表变量的函数
    猜你喜欢
    • 1970-01-01
    • 2019-08-12
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多