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

如何将数据框的日期区间列转换以适配geom_step可视化?

R语言数据框转换:适配阶梯图的日期区间处理

原始数据

首先给出原始数据的构造代码:

df <- structure(list(
  group = c("A", "A", "A", "A", "B", "B", "B", "B"),
  date1 = c("2022-01-01", "2022-01-03", "2022-01-06", "2022-01-07", "2022-01-01", "2022-01-02", "2022-01-04", "2022-01-06"),
  date2 = c("2022-01-03", "2022-01-06", "2022-01-07", "2022-01-10", "2022-01-02", "2022-01-04", "2022-01-06", "2022-01-09"),
  value = c(3, NA, 2, 2, NA, 1, NA, 4)
), class = "data.frame", row.names = c(NA, -8L))

原始数据预览:

groupdate1date2value
A2022-01-012022-01-033
A2022-01-032022-01-06NA
A2022-01-062022-01-072
A2022-01-072022-01-102
B2022-01-012022-01-02NA
B2022-01-022022-01-041
B2022-01-042022-01-06NA
B2022-01-062022-01-094

需求说明

需要对数据框做如下转换以适配阶梯图可视化:

  • 对于value不为NA的行,新增一行:以该行的date2同时作为新行的date1和date2,保留原value
  • value为NA的行保持不变

转换后的目标数据预览:

groupdate1date2value
A2022-01-012022-01-033
A2022-01-032022-01-033
A2022-01-032022-01-06NA
A2022-01-062022-01-072
A2022-01-072022-01-102
A2022-01-102022-01-102
B2022-01-012022-01-02NA
B2022-01-022022-01-041
B2022-01-042022-01-041
B2022-01-042022-01-06NA
B2022-01-062022-01-094
B2022-01-092022-01-094

实现方法

方法1:使用dplyr的行处理

通过rowwise()逐行判断,对非NA行生成两行数据:

library(dplyr)

df_transformed <- df %>%
  rowwise() %>%
  summarise(
    group = rep(group, ifelse(is.na(value), 1, 2)),
    date1 = ifelse(is.na(value), date1, c(date1, date2)),
    date2 = ifelse(is.na(value), date2, c(date2, date2)),
    value = rep(value, ifelse(is.na(value), 1, 2)),
    .groups = "drop"
  ) %>%
  # 转换日期列为Date类型,方便后续可视化
  mutate(across(c(date1, date2), as.Date))

方法2:使用purrr的逐行映射

逻辑更直观,逐行处理并拼接结果:

library(purrr)
library(dplyr)

df_transformed <- map_dfr(1:nrow(df), function(i) {
  row <- df[i,]
  if (!is.na(row$value)) {
    new_row <- row %>% mutate(date1 = date2, date2 = date2)
    bind_rows(row, new_row)
  } else {
    row
  }
}) %>%
  mutate(across(c(date1, date2), as.Date))

验证转换结果

运行以下代码查看转换后的数据:

print(df_transformed, n = 12)

输出将与目标数据完全一致。

阶梯图绘制

使用转换后的数据绘制阶梯图:

library(ggplot2)

ggplot(df_transformed, aes(x = date1, y = value, color = group, group = group)) +
  geom_step() +
  theme_minimal()

内容的提问来源于stack exchange,提问作者Quinten

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:10:26