如何在R中追踪两类面板调查数据的响应变化及变化率并可视化?
用ggplot2可视化面板调查数据的响应变化与变化率
当然可以!对于你的面板数据,核心是先把宽格式转成ggplot2友好的长格式,再计算响应比例和变化率,最后就能轻松做出两类变量的追踪图。下面是一步一步的实操代码和解释,都是新手能直接跑通的:
1. 准备工作:加载工具包并模拟数据
先加载处理数据和绘图的核心包,我会模拟和你结构一致的两类变量数据(包含colour和like两类,对应7次调查里的3个年份示例):
# 加载需要的包 library(tidyverse) # 模拟8000个样本的面板数据(和你的结构完全匹配) set.seed(123) # 固定随机数,保证结果可重复 df <- tibble( id = 1:8000, colour2011 = sample(0:1, 8000, replace = TRUE, prob = c(0.6, 0.4)), colour2016 = sample(0:1, 8000, replace = TRUE, prob = c(0.5, 0.5)), colour2018 = sample(0:1, 8000, replace = TRUE, prob = c(0.3, 0.7)), like2011 = sample(0:1, 8000, replace = TRUE, prob = c(0.4, 0.6)), like2016 = sample(0:1, 8000, replace = TRUE, prob = c(0.3, 0.7)), like2018 = sample(0:1, 8000, replace = TRUE, prob = c(0.2, 0.8)) )
2. 数据格式转换:宽转长
你的原始数据是宽格式(每列对应一个年份的变量),ggplot2需要长格式(一行对应一个样本的一次调查记录)。用pivot_longer拆分列名,把变量类型和年份分开:
df_long <- df %>% pivot_longer(-id, names_to = "variable_year", values_to = "response") %>% # 把"colour2011"拆成"colour"和"2011" separate(variable_year, into = c("variable", "year"), sep = -4) %>% mutate(year = as.integer(year)) # 把年份转成数值型,方便绘图
3. 计算核心指标:响应比例与变化率
虚拟变量的响应比例就是1的占比(直接用均值计算),变化率分绝对变化量和相对变化率两种,按需选择:
summary_df <- df_long %>% # 按变量类型、年份分组,计算响应比例 group_by(variable, year) %>% summarise(response_rate = mean(response), .groups = "drop") %>% # 按变量排序,方便计算变化率 arrange(variable, year) %>% group_by(variable) %>% mutate( # 绝对变化:当年比例 - 上一年比例 absolute_change = response_rate - lag(response_rate), # 相对变化率:(当年比例-上一年比例)/上一年比例 *100(百分比形式) relative_change = (absolute_change / lag(response_rate)) * 100 ) %>% ungroup()
4. 可视化:响应比例变化
用折线图展示两类变量的响应比例随年份的趋势,清晰追踪变化:
ggplot(summary_df, aes(x = year, y = response_rate, color = variable, group = variable)) + geom_line(size = 1.2) + # 折线粗细 geom_point(size = 3) + # 数据点大小 scale_y_continuous(labels = scales::percent_format(accuracy = 1)) + # y轴转百分比 labs( x = "调查年份", y = "响应比例(选择1的占比)", title = "两类变量的响应比例随时间变化", color = "变量类型" ) + theme_minimal() + theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold")) # 标题居中加粗
5. 可视化:变化率
用柱状图展示每年的相对变化率,直观看到各年份的增长/下降幅度:
ggplot(summary_df %>% filter(!is.na(relative_change)), aes(x = year, y = relative_change, fill = variable)) + geom_col(position = "dodge", width = 2) + # 分组柱状图 scale_y_continuous(labels = scales::percent_format(accuracy = 1)) + labs( x = "调查年份", y = "相对变化率(较上一年)", title = "两类变量的响应比例相对变化率", fill = "变量类型" ) + theme_minimal() + theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"))
注意事项
- 如果你的7次调查年份更多,只要列名是「变量名+年份」的格式,代码完全通用,不需要修改
- 相对变化率里第一年没有前一年数据,所以用
filter(!is.na(relative_change))过滤掉了,绘图时不会显示第一年的变化率
内容的提问来源于stack exchange,提问作者user20284482
相关产品推荐
相关产品推荐

