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

如何在R语言中转换问卷数据并创建小倍数图表

数据转换与小倍数图表实现方法

一、数据转换(转长格式并计算频率)

方法1:使用tidyverse(推荐新手,代码简洁易读)

先构造示例数据集,再用pivot_longer将宽格式转为长格式,最后用count统计各问题-回答组合的频率,还可将数字编码替换为对应文本标签:

# 加载tidyverse包
library(tidyverse)

# 构造示例数据集
df <- data.frame(
  Q1 = c(1,2,2,6,7,6),
  Q2 = c(6,6,6,6,1,6),
  Q3 = c(2,7,6,6,1,1)
)

# 转换为长格式并计算频率
long_df <- df %>%
  pivot_longer(cols = everything(), names_to = "Question", values_to = "Answer") %>%
  count(Question, Answer, name = "Frequency")

# 可选:将数字编码替换为文本标签
long_df <- long_df %>%
  mutate(Answer = case_when(
    Answer == 1 ~ "Yes",
    Answer == 2 ~ "No",
    Answer == 6 ~ "Don't know",
    Answer == 7 ~ "Valid skip"
  ))

方法2:基础R实现(无需额外安装包)

如果不想依赖tidyverse,可使用基础R的reshape和table函数完成转换:

# 构造示例数据集
df <- data.frame(
  Q1 = c(1,2,2,6,7,6),
  Q2 = c(6,6,6,6,1,6),
  Q3 = c(2,7,6,6,1,1)
)

# 转长格式
long_df_base <- reshape(df, 
                       varying = names(df),
                       v.names = "Answer",
                       timevar = "Question",
                       times = names(df),
                       direction = "long")

# 统计频率并转为数据框
freq_table <- table(long_df_base$Question, long_df_base$Answer)
long_df_base <- as.data.frame(freq_table)
colnames(long_df_base) <- c("Question", "Answer", "Frequency")

# 替换编码为文本标签
long_df_base$Answer <- factor(long_df_base$Answer, 
                             levels = c(1,2,6,7),
                             labels = c("Yes", "No", "Don't know", "Valid skip"))

二、小倍数图表实现

方法1:基于转换后的长格式数据绘图

用ggplot2的facet_wrap实现小倍数,直观展示每个问题的回答频率分布:

library(ggplot2)

ggplot(long_df, aes(x = Answer, y = Frequency, fill = Answer)) +
  geom_col(show.legend = FALSE) + # 柱状图展示频率
  facet_wrap(~Question, ncol = 3) + # 按问题分面生成小倍数
  labs(x = "回答类型", y = "频率", title = "各问题回答频率分布") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 旋转x轴标签避免重叠

方法2:无需提前计算频率,直接绘图

可将数据转换与绘图步骤合并,用geom_bar自动统计频率,简化流程:

library(tidyverse)

df %>%
  pivot_longer(cols = everything(), names_to = "Question", values_to = "Answer") %>%
  mutate(Answer = case_when(
    Answer == 1 ~ "Yes",
    Answer == 2 ~ "No",
    Answer == 6 ~ "Don't know",
    Answer == 7 ~ "Valid skip"
  )) %>%
  ggplot(aes(x = Answer)) +
  geom_bar() + # 自动统计每个回答的数量
  facet_wrap(~Question, ncol = 3) +
  labs(x = "回答类型", y = "频率", title = "各问题回答频率分布") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

内容的提问来源于stack exchange,提问作者Viet Hang Le

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:05:13