You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用R的dplyr函数将李克特量表因子列从长转宽?

使用dplyr将李克特量表数据转换为占比宽格式

需求说明

现有一个包含3个因子列的数据框,所有列的水平均为相同的李克特量表选项,原始数据结构示例如下:

ABC
1-Strongly disagree5-Strongly agree1-Strongly disagree
3-so-so5-Strongly agree2-Disagree
4-Agree2-Disagree2-Disagree
2-Disagree2-Disagree5-Strongly agree

需要将其转换为以下宽格式,单元格数值为各选项的占比:

Item1-Strongly disagree2-Disagree3-so-so4-Agree5-Strongly agree
A26.7221.4127.4517.806.59
B25.020.228.2718.368.0
C6.39.528.640.3515.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)

步骤解释

  1. pivot_longer:把原始宽格式数据转为长格式,统一将A/B/C标记为Item,对应的李克特选项存入Response列,便于后续分组统计。
  2. 分组统计次数:按Item和Response分组,用n()统计每组的样本量。
  3. 计算占比:按Item再次分组,用当前选项的次数除以该Item的总次数,乘以100得到百分比,并用round()保留两位小数。
  4. pivot_wider:将长格式转回宽格式,让每个李克特选项成为独立列,最终得到目标结构。

内容的提问来源于stack exchange,提问作者Homer Jay Simpson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 09:27:04