如何对含多种列类型的数据集使用dplyr的across及mutate across功能
解决方案
报错原因
- 语法结构错误:
across()的使用方法不符合规范,转换函数需要作为across()的第二个参数传入,不能放在across()的外部。 - 选列范围错误:未限制需要转换的列范围,直接全选所有列会让数值、逻辑类型的列和字符串做等值判断,触发类型不兼容报错。
- 类型匹配错误:
case_when默认返回的NA为逻辑类型,和前面返回的数值类型不一致,会额外触发类型警告。
最优方案(按列名匹配转换)
直接匹配列名包含s或f的满意度列,不会改动姓名、日期、考试分数、是否早到等无关列,代码如下:
library(dplyr) test %>% mutate(across(c(contains("s"), contains("f")), ~ case_when( . == "Strongly Agree" ~ 5, . == "Agree" ~ 4, . == "Neutral" ~ 3, . == "Disagree" ~ 2, . == "Strongly Disagree" ~ 1, TRUE ~ NA_real_ )))
可选方案(全量字符列自动转换)
如果确实需要扫描所有字符类型列做转换,可通过where(is.character)限定仅处理字符列,注意该方案会把姓名、日期等其他字符列的非满意度内容转换为NA,无特殊需求不推荐使用:
test %>% mutate(across(where(is.character), ~ case_when( . == "Strongly Agree" ~ 5, . == "Agree" ~ 4, . == "Neutral" ~ 3, . == "Disagree" ~ 2, . == "Strongly Disagree" ~ 1, TRUE ~ NA_real_ )))
内容的提问来源于stack exchange,提问作者J.Sabree
相关产品推荐
相关产品推荐

