基于起止日期为日期序列DataFrame匹配对应变量的实现方法
匹配日期序列与变量起止区间
需求说明
将存储连续日期序列的DataFrame与包含变量起止日期的DataFrame合并,为每个日期分配对应的变量,得到指定格式的结果。
可复现数据
# 生成日期序列DataFrame date.seq <- seq.Date(as.Date("01/01/2024", '%m/%d/%Y'), by = 'day', length.out = 20) date.df <- as.data.frame(date.seq) # 生成变量起止日期DataFrame x.start <- as.Date("01/01/2024", '%d/%m/%Y') y.start <- as.Date("10/01/2024", '%d/%m/%Y') z.start <- as.Date("17/01/2024", '%d/%m/%Y') x.end <- as.Date("10/01/2024", '%d/%m/%Y') y.end <- as.Date("17/01/2024", '%d/%m/%Y') z.end <- as.Date("20/01/2024", '%d/%m/%Y') df <- data.frame(var = c('x','y','z'), start = c(x.start, y.start, z.start), end = c(x.end, y.end, z.end))
解决方案
方法1:Base R 实现
直接遍历日期序列,匹配对应变量区间:
# 为每个日期匹配对应变量并转大写 date.df$Var <- toupper(sapply(date.df$date.seq, function(d) { df$var[df$start <= d & d <= df$end] })) # 输出结果 print(date.df)
方法2:dplyr + lubridate 实现(高效简洁)
适合数据量较大的场景,通过交叉组合后筛选:
library(dplyr) library(lubridate) result <- date.df %>% crossing(df) %>% # 生成所有日期与变量的组合 filter(date.seq >= start, date.seq <= end) %>% # 筛选符合区间的记录 mutate(Var = toupper(var)) %>% # 变量名转大写 select(date.seq, Var) # 保留目标列 # 输出结果 print(result)
结果验证
两种方法均会输出符合预期的结果:
date.seq Var 1 2024-01-01 X 2 2024-01-02 X 3 2024-01-03 X 4 2024-01-04 X 5 2024-01-05 X 6 2024-01-06 X 7 2024-01-07 X 8 2024-01-08 X 9 2024-01-09 X 10 2024-01-10 X 11 2024-01-11 Y 12 2024-01-12 Y 13 2024-01-13 Y 14 2024-01-14 Y 15 2024-01-15 Y 16 2024-01-16 Y 17 2024-01-17 Y 18 2024-01-18 Z 19 2024-01-19 Z 20 2024-01-20 Z
内容的提问来源于stack exchange,提问作者Shaggy Glitch
相关产品推荐
相关产品推荐

