使用case_when()与mutate()时无法将新变量保存至数据框的问题
解决方法
你的代码问题在于没有将mutate生成的结果赋值回数据框,管道操作只会返回处理后的结果,但不会自动修改原数据对象。按以下两种方式修改即可:
方式1:覆盖原数据框
将处理后的结果重新赋值给原data,新变量会直接保存到原数据框中:
data <- data %>% mutate(motivation = case_when(DRG_WHY_TRY == 1 ~ 'experimentation' ,DRG_WHY_SLP == 1 ~ 'cope' ,DRG_WHY_RLX == 1 ~ 'cope' ,DRG_WHY_PAN == 1 ~ 'medical' ,DRG_WHY_NTH == 1 ~ 'bored' ,DRG_WHY_NCN == 1 ~ 'no conseq' ,DRG_WHY_MED == 1 ~ 'medical' ,DRG_WHY_HIG == 1 ~ 'enhancement' ,DRG_WHY_FUN == 1 ~ 'social' ,DRG_WHY_FRD == 1 ~ 'conformity' ,DRG_WHY_FGT == 1 ~ 'cope' ,DRG_WHY_FEL == 1 ~ 'enhancement' ,DRG_WHY_ANX == 1 ~ 'cope' ,TRUE ~ 'else'))
方式2:保存到新数据框
如果不想修改原数据,可将结果存入新对象,避免覆盖原始数据:
data_with_motivation <- data %>% mutate(motivation = case_when(DRG_WHY_TRY == 1 ~ 'experimentation' ,DRG_WHY_SLP == 1 ~ 'cope' ,DRG_WHY_RLX == 1 ~ 'cope' ,DRG_WHY_PAN == 1 ~ 'medical' ,DRG_WHY_NTH == 1 ~ 'bored' ,DRG_WHY_NCN == 1 ~ 'no conseq' ,DRG_WHY_MED == 1 ~ 'medical' ,DRG_WHY_HIG == 1 ~ 'enhancement' ,DRG_WHY_FUN == 1 ~ 'social' ,DRG_WHY_FRD == 1 ~ 'conformity' ,DRG_WHY_FGT == 1 ~ 'cope' ,DRG_WHY_FEL == 1 ~ 'enhancement' ,DRG_WHY_ANX == 1 ~ 'cope' ,TRUE ~ 'else'))
额外提示
如果数据中存在多个DRG_WHY_*变量同时为1的情况,case_when只会取第一个匹配的分类。若需要处理多动机的场景,可调整逻辑(比如用if_any标记多匹配,或合并对应分类)。
内容的提问来源于stack exchange,提问作者Freya_Luna
相关产品推荐
相关产品推荐

