R语言绘制含缺失日期范围的时间序列:数据处理实现问询
在R中绘制带缺失日期范围的时间序列(含数据预处理)
我完全懂这种“别人觉得简单但自己就是卡壳”的无奈!咱们从你的数据框出发,一步步搞定这个问题。首先先把你提供的数据框结构明确下来(我帮你补全了area..km.2.列的缺失内容,方便后续操作):
A <- structure( list( start..yyyy.mm. = c(197901L, 197901L, 197901L, 197901L, 197901L), X.yyyy.mm. = c(197901L, 197904L, 197908L, 197902L, 197902L), duration = c(1L, 4L, 8L, 2L, 2L), area..km.2. = structure( c(1L, 2L, 4L, 3L, 5L), .Label = c( "46952.85", "c(125267.7, 72379.43, 72468.91, 13200.26)", "c(19814.74, 39570.96)", "c(26513.05, 26513.05, 26513.05, 26513.05, 26513.05, 26513.05, 26513.05, 26513.05)", "c(56789.12, 67890.12)" ) ) ), class = "data.frame", row.names = c(NA, -5L) )
第一步:数据预处理
你的数据有两个关键问题需要先解决:日期是整数格式、area..km.2.列是字符串形式的向量。
1. 转换日期格式
把start..yyyy.mm.和X.yyyy.mm.转成R能识别的日期类型,我们先把整数转成yyyy-mm格式的字符串,再用lubridate包的ym()函数处理:
library(lubridate) library(dplyr) library(tidyr) library(ggplot2) A <- A %>% mutate( start_date = ym(paste0(substr(as.character(start..yyyy.mm.), 1, 4), "-", substr(as.character(start..yyyy.mm.), 5, 6))), end_date = ym(paste0(substr(as.character(X.yyyy.mm.), 1, 4), "-", substr(as.character(X.yyyy.mm.), 5, 6))) )
2. 解析area列的字符串向量
area..km.2.列现在是c(...)格式的字符串,我们用eval(parse(text=...))把它转成数值向量,再把每个向量的元素拆成单独的行,让每个月份对应一个面积值:
A <- A %>% mutate(area_list = lapply(area..km.2., function(x) eval(parse(text = x)))) %>% unnest(area_list) %>% # 生成每个时间段内的所有月份 mutate(month_seq = map2(start_date, duration, ~seq(.x, by = "month", length.out = .y))) %>% unnest(month_seq) %>% select(month_seq, area = area_list)
第二步:处理缺失日期范围
我们需要生成从最早到最晚月份的完整时间序列,再和现有数据合并,自动标记缺失值:
# 生成完整的月份序列 full_month_seq <- seq(min(A$month_seq), max(A$month_seq), by = "month") %>% as.data.frame() %>% rename(month_seq = .) # 合并数据,缺失的area会自动填充为NA full_ts_data <- full_month_seq %>% left_join(A, by = "month_seq")
第三步:绘制带缺失范围的时间序列
用ggplot2绘制,缺失的日期范围会用半透明色块标记,现有数据用折线和点展示:
ggplot(full_ts_data, aes(x = month_seq, y = area)) + geom_line(color = "#2c3e50", size = 1) + geom_point(color = "#e74c3c") + # 标记缺失的日期区间 geom_rect( data = full_ts_data %>% filter(is.na(area)), aes(xmin = month_seq, xmax = lead(month_seq), ymin = -Inf, ymax = Inf), fill = "#f39c12", alpha = 0.2 ) + labs(x = "日期", y = "面积 (km²)", title = "带缺失日期范围的面积时间序列") + theme_minimal()
这样你就能得到一张清晰的时间序列图,缺失的日期段会直观显示出来,现有数据的变化趋势也一目了然。
内容的提问来源于stack exchange,提问作者code123
相关产品推荐
相关产品推荐

