在R中创建日期前后标记变量列并生成各县连续日期序列
搞定R语言日期分段标识与连续日期生成的小技巧
嘿,我来帮你解决这个日期处理的需求!你需要完成两个核心任务:一是给日期打标签区分特定日期前后,二是为每个县生成指定时间段的连续日期并分类。下面我用tidyverse和lubridate包来一步步实现,附上示例数据和期望输出。
先准备示例数据
假设我们有几个县,每个县对应一个特定的分界日期,示例数据如下:
library(tidyverse) library(lubridate) # 示例输入:县名 + 各自的分界日期 county_data <- tibble( county = c("县A", "县B", "县C"), cutoff_date = ymd(c("2020-03-15", "2020-04-01", "2020-02-20")) )
分步实现需求
第一步:为每个县生成连续日期
我们需要给每个县扩展出2020-01-01到2020-06-01的所有日期,用map配合unnest就能轻松搞定:
# 生成每个县的连续日期序列 expanded_data <- county_data %>% mutate(date = map(cutoff_date, ~seq(ymd("2020-01-01"), ymd("2020-06-01"), by = "day"))) %>% unnest(date)
第二步:添加日期分段标识
接下来根据每个县的分界日期,把日期标记为"BO"(分界日前)和"DO"(分界日及之后),用case_when逻辑清晰又好维护:
# 添加分段标识列 final_data <- expanded_data %>% mutate(period = case_when( date < cutoff_date ~ "BO", date >= cutoff_date ~ "DO" ))
看看期望输出
以"县A"为例,它的分界日期是2020-03-15,我们截取部分结果看看:
# 查看县A的部分结果 final_data %>% filter(county == "县A") %>% slice(1:10, 75:85)
输出大概是这样的(简化版):
# A tibble: 21 × 4 county cutoff_date date period <chr> <date> <date> <chr> 1 县A 2020-03-15 2020-01-01 BO 2 县A 2020-03-15 2020-01-02 BO ... 10 县A 2020-03-15 2020-01-10 BO 11 县A 2020-03-15 2020-03-15 DO 12 县A 2020-03-15 2020-03-16 DO ... 21 县A 2020-03-15 2020-03-25 DO
小提示
- 一定要用
lubridate::ymd()把字符转成日期格式,不然日期判断容易出问题; - 如果你的分界规则需要调整(比如不含分界日当天),直接改
case_when里的条件就行; map+unnest的组合在处理分组生成序列时特别好用,比循环高效多啦!
内容的提问来源于stack exchange,提问作者skywalkerzhai
相关产品推荐
相关产品推荐

