You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于带起止日期(含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 11:21:06