如何在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
相关产品推荐
相关产品推荐

