如何批量将R中多列Likert评分转为指定水平的因子
批量将数值型Likert评分转换为因子变量
我有一份包含Pre、Mid、Post三个时间点的Likert评分调研数据,21列评分均为数值型存储。希望一次性将这些列转换为带有指定水平和标签的因子,而非逐列重复调用factor函数。
单列转换的可行代码示例:
data$Pre_S1 <- factor(data$Pre_S1, levels = c(1, 2, 3, 4, 5, 6), labels = c( "Strongly Disagree", "Moderately Disagree", "Slightly Disagree", "Slightly Agree", "Moderately Agree", "Strongly Agree" ) )
我尝试的批量处理代码未成功:
data %>% mutate(across( c( "Pre_S1", "Pre_S2", "Pre_S3", "Pre_S4", "Pre_S5", "Pre_S6", "Pre_S7", "Mid_S1", "Mid_S2", "Mid_S3", "Mid_S4", "Mid_S5", "Mid_S6", "Mid_S7", "Post_S1", "Post_S2", "Post_S3", "Post_S4", "Post_S5", "Post_S6", "Post_S7" ), as.factor(data, levels = c(1, 2, 3, 4, 5, 6), labels = c( "Strongly Disagree", "Moderately Disagree", "Slightly Disagree", "Slightly Agree", "Moderately Agree", "Strongly Agree" ) ) ))
问题原因
你的批量代码有两个关键错误:
- 使用了
as.factor而非factor,且错误地将整个data数据集传入函数,而across要求函数针对每一列单独处理。 - 未正确使用匿名函数或公式语法来传递列参数。
正确实现代码
方法1:手动指定列名
data <- data %>% mutate(across( c( "Pre_S1", "Pre_S2", "Pre_S3", "Pre_S4", "Pre_S5", "Pre_S6", "Pre_S7", "Mid_S1", "Mid_S2", "Mid_S3", "Mid_S4", "Mid_S5", "Mid_S6", "Mid_S7", "Post_S1", "Post_S2", "Post_S3", "Post_S4", "Post_S5", "Post_S6", "Post_S7" ), ~factor(., levels = c(1, 2, 3, 4, 5, 6), labels = c( "Strongly Disagree", "Moderately Disagree", "Slightly Disagree", "Slightly Agree", "Moderately Agree", "Strongly Agree" ) ) ))
方法2:正则匹配列名(简化写法)
不用手动罗列21个列名,用正则表达式匹配所有符合Pre_Sn/Mid_Sn/Post_Sn格式的列:
data <- data %>% mutate(across( matches("^(Pre|Mid|Post)_S\\d+$"), ~factor(., levels = c(1, 2, 3, 4, 5, 6), labels = c( "Strongly Disagree", "Moderately Disagree", "Slightly Disagree", "Slightly Agree", "Moderately Agree", "Strongly Agree" ) ) ))
说明
~factor(., ...)是tidyverse的公式语法,.代表当前正在处理的列。- 执行后记得将结果重新赋值给
data(或新变量),否则修改不会保存。
内容的提问来源于stack exchange,提问作者mindyeti
相关产品推荐
相关产品推荐

