R语言时间序列图表求助:年月列合并及双轴图制作问题
解决两个R数据处理问题:日期合并NA与双轴时间序列图
一、月份+年份合并为日期时全为NA的解决办法
这种情况大概率是月份的格式不匹配解析规则,或者数据类型不对(比如年份带奇怪符号、月份拼写错误)。我给你几个靠谱的方案,按需选择:
情况1:月份是数字(1-12),年份是整数/字符
用lubridate包的make_date()函数最省心,直接指定年、月,日默认设为1即可:
library(lubridate) df$Date <- make_date(year = df$Year, month = df$Month, day = 1)
如果没装lubridate,用基础R也能搞定:先把年月拼成标准格式再转日期
df$Date <- as.Date(paste(df$Year, df$Month, "01", sep = "-"))
情况2:月份是文本(比如"January"或"Jan")
还是lubridate最省心,它能自动识别各种月份文本:
# 直接解析年月,默认日为1 df$Date <- my(paste(df$Month, df$Year)) # 或者用完整拼接写法 df$Date <- dmy(paste("01", df$Month, df$Year))
用基础R的话,需要指定format参数匹配月份格式:
# 月份是全称(如"January")用%B,缩写(如"Jan")用%b df$Date <- as.Date(paste("01", df$Month, df$Year), format = "%d %B %Y") # 缩写版: df$Date <- as.Date(paste("01", df$Month, df$Year), format = "%d %b %Y")
排坑提示:
- 先检查
df$Month和df$Year有没有缺失值(sum(is.na(df$Month))),缺失值会直接导致NA - 如果月份是字符但有拼写错误(比如"Januay"),也会解析失败,得先清洗数据
二、制作Score柱状图+n折线图的双轴时间序列图
用ggplot2就能实现,核心是用sec.axis设置右侧y轴,同时分别映射两个变量的几何对象:
给你完整代码示例(假设日期列已处理为Date):
library(ggplot2) ggplot(df, aes(x = Date)) + # 绘制Score的柱状图 geom_col(aes(y = Score), fill = "#2E8B57", alpha = 0.7) + # 绘制n的折线图(如果n和Score数值差距大,需要先缩放) geom_line(aes(y = n / max(n) * max(df$Score)), color = "#FF6347", size = 1.2) + geom_point(aes(y = n / max(n) * max(df$Score)), color = "#FF6347", size = 2) + # 设置右侧y轴,对应n的原始值 scale_y_continuous( name = "Score", sec.axis = sec_axis(~ . * max(df$Score) / max(df$n), name = "n") ) + labs(title = "Score vs n Over Time", x = "Date") + theme_minimal() + theme( axis.title.y = element_text(color = "#2E8B57"), axis.title.y.right = element_text(color = "#FF6347") )
关键说明:
- 如果
Score和n的数值范围差距大,必须把n缩放成和Score同范围的数值,才能在同一图里展示;如果范围接近,可以直接把折线的y设为n,然后sec.axis = sec_axis(~ ., name = "n") - 右侧轴的公式是反向缩放,把缩放后的数值转回
n的原始范围,确保显示的是真实数值
内容的提问来源于stack exchange,提问作者Neel Rajani
相关产品推荐
相关产品推荐

