在R中统计每年唯一事件数量并绘制柱状图的问题求解
问题原因
你的代码存在两个核心问题:
- 未从
service_date字段中提取年份维度,直接使用完整日期作为X轴,导致每个独立日期都被单独统计 - 直接在
geom_bar的美学映射中调用n_distinct函数,不会自动按年份分组计算唯一值,无法得到预期的分年度统计结果
解决方案
以下两种实现方式均可得到符合要求的柱状图:
方式1:先汇总数据再绘图(逻辑最清晰,推荐使用)
library(dplyr) library(ggplot2) # 提取年份,按年分组统计唯一事件数 d_summary <- d %>% # 若不想安装lubridate包,可替换为 mutate(year = format(service_date, "%Y")) mutate(year = lubridate::year(service_date)) %>% group_by(year) %>% summarise(unique_event_cnt = n_distinct(event), .groups = "drop") # 绘制柱状图 ggplot(d_summary, aes(x = factor(year), y = unique_event_cnt)) + geom_col(fill = "steelblue") + labs(x = "年份", y = "唯一事件数量")
方式2:直接在ggplot中实时计算(无需提前汇总)
library(dplyr) library(ggplot2) d %>% mutate(year = factor(lubridate::year(service_date))) %>% ggplot(aes(x = year, y = event)) + stat_summary(fun = n_distinct, geom = "col", fill = "steelblue") + labs(x = "年份", y = "唯一事件数量")
两种方案运行后均会得到3根高度为2的柱子,分别对应2011、2012、2013年的唯一事件计数,和你预期的效果一致。
内容的提问来源于stack exchange,提问作者logjammin
相关产品推荐
相关产品推荐

