如何用R的dplyr函数将李克特量表因子列从长转宽?
使用dplyr将李克特量表数据转换为占比宽格式
需求说明
现有一个包含3个因子列的数据框,所有列的水平均为相同的李克特量表选项,原始数据结构示例如下:
| A | B | C |
|---|---|---|
| 1-Strongly disagree | 5-Strongly agree | 1-Strongly disagree |
| 3-so-so | 5-Strongly agree | 2-Disagree |
| 4-Agree | 2-Disagree | 2-Disagree |
| 2-Disagree | 2-Disagree | 5-Strongly agree |
需要将其转换为以下宽格式,单元格数值为各选项的占比:
| Item | 1-Strongly disagree | 2-Disagree | 3-so-so | 4-Agree | 5-Strongly agree |
|---|---|---|---|---|---|
| A | 26.72 | 21.41 | 27.45 | 17.80 | 6.59 |
| B | 25.0 | 20.2 | 28.27 | 18.36 | 8.0 |
| C | 6.3 | 9.5 | 28.6 | 40.35 | 15.17 |
模拟数据生成代码:
A = sample(c('1-Strongly disagree','2-Disagree','3-so-so','4-Agree','5-Strongly agree'),1000,replace = TRUE) B = sample(c('1-Strongly disagree','2-Disagree','3-so-so','4-Agree','5-Strongly agree'),1000,replace = TRUE) C = sample(c('1-Strongly disagree','2-Disagree','3-so-so','4-Agree','5-Strongly agree'),1000,replace = TRUE) df = tibble(A,B,C)%>% mutate(across(everything(),as.factor));df
解决方案
通过数据重塑→分组统计→再重塑的流程即可实现,完整dplyr代码如下:
library(dplyr) library(tidyr) # 模拟数据(可替换为你的实际数据) A = sample(c('1-Strongly disagree','2-Disagree','3-so-so','4-Agree','5-Strongly agree'),1000,replace = TRUE) B = sample(c('1-Strongly disagree','2-Disagree','3-so-so','4-Agree','5-Strongly agree'),1000,replace = TRUE) C = sample(c('1-Strongly disagree','2-Disagree','3-so-so','4-Agree','5-Strongly agree'),1000,replace = TRUE) df = tibble(A,B,C)%>% mutate(across(everything(),as.factor)) # 核心转换逻辑 result_df <- df %>% # 宽转长:将列名转为Item,选项值转为Response pivot_longer(cols = everything(), names_to = "Item", values_to = "Response") %>% # 分组统计每个Item下各Response的出现次数 group_by(Item, Response) %>% summarise(Count = n(), .groups = "drop") %>% # 按Item计算各Response的占比(保留2位小数) group_by(Item) %>% mutate(Percentage = round((Count / sum(Count)) * 100, 2)) %>% select(-Count) %>% # 长转宽:将Response转为列,填充对应百分比 pivot_wider(names_from = Response, values_from = Percentage) # 输出结果 print(result_df)
步骤解释
pivot_longer:把原始宽格式数据转为长格式,统一将A/B/C标记为Item,对应的李克特选项存入Response列,便于后续分组统计。- 分组统计次数:按
Item和Response分组,用n()统计每组的样本量。 - 计算占比:按
Item再次分组,用当前选项的次数除以该Item的总次数,乘以100得到百分比,并用round()保留两位小数。 pivot_wider:将长格式转回宽格式,让每个李克特选项成为独立列,最终得到目标结构。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

