在R中忽略年份按月日排序并绘制跨年度月日直方图的方法
跨年月-日排序问题的简单解决办法
要解决仅按月-日排序、忽略年份且避免字符排序错误的问题,有两种直接有效的方法:
方法1:使用带前导零的月-日字符串
直接将日期格式化为%m-%d格式的字符串,这种格式会自动为月份和日期补前导零(比如1月1日变为01-01,1月10日变为01-10),字符串排序逻辑会和实际日期顺序完全匹配。
library(lubridate) library(tidyverse) # 导入示例数据 df <- structure(list(date = structure(c(19512, 13135, 14242), class = "Date"), sport = c("MLB", "NFL", "NHL")), row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame")) # 生成带前导零的月-日列 df <- df %>% mutate(month_day = format(date, "%m-%d")) # 绘制直方图(以频数为例) ggplot(df, aes(x = month_day)) + geom_bar() + theme(axis.text.x = element_text(angle = 45, hjust = 1))
方法2:基于一年中的天数排序(更稳妥)
用yday()函数提取日期在一年中的天数(1到366),以此作为排序依据,将月-日转换为有序因子,彻底避免字符排序的问题,同时支持闰年2月29日的特殊情况。
# 生成yday和月-日列,并转换为有序因子 df <- df %>% mutate( day_of_year = yday(date), month_day = format(date, "%m-%d") ) %>% mutate(month_day = fct_reorder(month_day, day_of_year)) # 绘制直方图 ggplot(df, aes(x = month_day)) + geom_bar() + theme(axis.text.x = element_text(angle = 45, hjust = 1))
两种方法都能解决1-10排在1-2之前的字符排序错误问题,其中方法2的排序逻辑更严谨,适合复杂日期场景。
内容的提问来源于stack exchange,提问作者Jeff Henderson
相关产品推荐
相关产品推荐

