如何拆分R数据框2020M07格式日期列并绘制分组折线图?
解决方案:从自定义日期格式提取年月并优化ggplot折线图
一、新增年份与月份列的方法
方法1:字符串截取(类似Excel LEFT/RIGHT思路)
完全可以通过dplyr::mutate结合字符串截取实现,和Excel逻辑一致:
df_syss_natt <- df_syss_natt %>% mutate( år = substr(månad, 1, 4), # 提取前4位作为年份 månad_nr = as.integer(substr(månad, 6, 7)) # 提取最后2位作为月份并转成整数 )
方法2:lubridate日期解析(更健壮的规范处理)
既然已加载lubridate,可以先将自定义格式转为标准日期,再提取年月,避免字符串截取的潜在错误:
df_syss_natt <- df_syss_natt %>% mutate( datum = ym(månad), # 将"2020M07"解析为当月第一天的日期 år = year(datum), # 提取年份 månad_nr = month(datum, label = TRUE) # 提取月份缩写(如"Jul"),适合x轴展示;要数字则设label=FALSE )
方法3:tidyr拆分字符串(一步到位的tidyverse风格)
用tidyr::separate直接按分隔符"M"拆分列,自动转类型:
df_syss_natt <- df_syss_natt %>% separate(månad, into = c("år", "månad_nr"), sep = "M", convert = TRUE)
convert=TRUE会自动把年份、月份转为数值类型,无需额外转换。
二、优化后的ggplot绘图代码
基于上述任意方法生成的列,即可按年份分组绘制折线,x轴仅显示月份:
ggplot(df_syss_natt, aes(x = månad_nr, y = syss_natt, color = år, group = år)) + geom_point() + geom_line() + labs( x = "月份", y = "夜间就业人数", color = "年份", title = "各年份夜间就业人数月度趋势" ) + theme_minimal()
color=år让不同年份折线用颜色区分group=år确保同一年份的点被正确连接- 若用
lubridate的label=TRUE,x轴会自动显示月份缩写,避免拥挤
三、完整修改后的代码(以separate方法为例)
library(pxweb) library(tidyverse) library(astsa) library(forecast) library(scales) library(plotly) library(zoo) library(lubridate) # PXWEB 查询 pxweb_query_list_BAS <- list("Region"=c("22"), "Kon" =c("1+2"), "SNI2007" =c("A-U+US"), "ContentsCode"=c("000005F3")) # 下载数据 px_data_BAS <- pxweb_get(url = "https://api.scb.se/OV0104/v1/doris/sv/ssd/START/AM/AM0210/AM0210B/ArbStDoNMN", query = pxweb_query_list_BAS) # 转换为数据框并处理日期 df_syss_natt <- as.data.frame(px_data_BAS, column.name.type = "text", variable.value.type = "text") %>% rename(syss_natt = 'sysselsatta efter bostadens belägenhet') %>% filter(månad > "2020") %>% # 注意månad是字符型,需加引号 separate(månad, into = c("år", "månad_nr"), sep = "M", convert = TRUE) # 绘制优化后的折线图 ggplot(df_syss_natt, aes(x = månad_nr, y = syss_natt, color = factor(år), group = år)) + geom_point(size = 2) + geom_line(linewidth = 1) + labs( x = "月份", y = "夜间就业人数", color = "年份", title = "瑞典某地区夜间就业人数月度趋势(2020年起)" ) + scale_x_continuous(breaks = 1:12) + # 强制显示1-12月刻度 theme_minimal()
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

