如何基于带起止日期(含NA)的数据集生成累计值时间序列?
生成累计启动/结束项的时间序列数据
我有一个包含项目起止日期(部分结束日期为NA)的数据集,想要生成一个时间序列,展示累计已启动项和累计已结束项的数量,后续用来绘制折线图,也接受其他便于绘图的数据结构。
示例数据
df <- data.frame( name = c("building a", "building b", "building c", "building d", "building e"), start = as.Date(c("2011-04-09", "2011-12-30", "2012-11-10", "2015-06-05", "2017-03-12")), end = as.Date(c("2016-05-04", NA, "2015-01-19", NA, "2019-04-06")) ) # 查看数据 df #> name start end #> 1 building a 2011-04-09 2016-05-04 #> 2 building b 2011-12-30 <NA> #> 3 building c 2012-11-10 2015-01-19 #> 4 building d 2015-06-05 <NA> #> 5 building e 2017-03-12 2019-04-06
期望输出
#> date started ended #> 1 2011-04-09 1 0 #> 2 2011-12-30 2 0 #> 3 2012-11-10 3 0 #> 4 2015-01-19 3 1 #> 5 2015-06-05 4 1 #> 6 2016-05-04 4 2 #> 7 2017-03-12 5 2 #> 8 2019-04-06 5 3
解决方案
使用tidyverse工具包可以快速实现需求,步骤如下:
1. 加载工具包
library(tidyverse)
2. 转换数据格式并计算累计数
将原数据转为长格式区分启动/结束事件,再按日期排序后计算累计值:
# 提取所有有效事件(去掉NA的结束日期)并排序 events <- df %>% pivot_longer(cols = c(start, end), names_to = "event", values_to = "date") %>% drop_na(date) %>% arrange(date) # 计算累计启动和结束数量,确保每个日期唯一 cumulative_data <- events %>% mutate( started = cumsum(event == "start"), ended = cumsum(event == "end") ) %>% select(date, started, ended) %>% distinct(date, .keep_all = TRUE) # 查看结果 cumulative_data
3. 转换为绘图友好的格式(可选)
如果要绘制折线图,转为长格式更方便:
plot_ready_data <- cumulative_data %>% pivot_longer(cols = c(started, ended), names_to = "category", values_to = "count") # 绘制折线图 ggplot(plot_ready_data, aes(x = date, y = count, color = category)) + geom_line(linewidth = 1) + labs(x = "日期", y = "累计数量", color = "项目状态") + theme_minimal()
内容的提问来源于stack exchange,提问作者short_stack
相关产品推荐
相关产品推荐

