如何将数据框的日期区间列转换以适配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))
原始数据预览:
| group | date1 | date2 | value |
|---|---|---|---|
| A | 2022-01-01 | 2022-01-03 | 3 |
| A | 2022-01-03 | 2022-01-06 | NA |
| A | 2022-01-06 | 2022-01-07 | 2 |
| A | 2022-01-07 | 2022-01-10 | 2 |
| B | 2022-01-01 | 2022-01-02 | NA |
| B | 2022-01-02 | 2022-01-04 | 1 |
| B | 2022-01-04 | 2022-01-06 | NA |
| B | 2022-01-06 | 2022-01-09 | 4 |
需求说明
需要对数据框做如下转换以适配阶梯图可视化:
- 对于
value不为NA的行,新增一行:以该行的date2同时作为新行的date1和date2,保留原value value为NA的行保持不变
转换后的目标数据预览:
| group | date1 | date2 | value |
|---|---|---|---|
| A | 2022-01-01 | 2022-01-03 | 3 |
| A | 2022-01-03 | 2022-01-03 | 3 |
| A | 2022-01-03 | 2022-01-06 | NA |
| A | 2022-01-06 | 2022-01-07 | 2 |
| A | 2022-01-07 | 2022-01-10 | 2 |
| A | 2022-01-10 | 2022-01-10 | 2 |
| B | 2022-01-01 | 2022-01-02 | NA |
| B | 2022-01-02 | 2022-01-04 | 1 |
| B | 2022-01-04 | 2022-01-04 | 1 |
| B | 2022-01-04 | 2022-01-06 | NA |
| B | 2022-01-06 | 2022-01-09 | 4 |
| B | 2022-01-09 | 2022-01-09 | 4 |
实现方法
方法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
相关产品推荐
相关产品推荐

