如何为起止日期不同的STAND生成按周间隔的中间日期数据框
地块周间隔日期数据集生成方案
原始数据集代码
library(dplyr) library(lubridate) DS_F_norm_sel <- read.csv("https://raw.githubusercontent.com/Leprechault/trash/main/indexes_dates_bug.csv") DS_F_norm_sel <- DS_F_norm_sel %>% dplyr::select(STAND, DATE, STATUS, SAVI_MAX, MSR_SD, GCI_SD) DS_F_norm_sel$DATE <- lubridate::ymd(DS_F_norm_sel$DATE) max_min_stands <- DS_F_norm_sel %>% group_by(STAND) %>% dplyr::summarize(max_date = max(DATE), min_date = min(DATE)) as.data.frame(max_min_stands) # 输出示例: # STAND max_date min_date # 1 ALAMEDA_007A 2022-03-28 2022-02-11 # 2 ALCINA_001A 2022-04-20 2022-02-09 # 3 ALDOSANI_031A 2022-06-11 2022-02-11 # ... # 184 VILAPALMA_033K 2022-04-02 2022-02-01 # 185 VILAPALMA_038G 2022-05-22 2022-02-01
需求说明
需要创建与原数据集结构一致的新数据框new.DS_F_norm_sel,包含每个STAND从最小日期到最大日期之间的所有按周间隔的日期,期望输出格式如下:
new.DS_F_norm_sel STAND DATE ALAMEDA_007A 2022-02-11 ALAMEDA_007A 2022-02-18 ALAMEDA_007A 2022-02-25 ... ALAMEDA_007A 2022-03-28 ... VILAPALMA_038G 2022-02-01 VILAPALMA_038G 2022-02-08 ... VILAPALMA_038G 2022-05-22
解决方案代码
library(dplyr) library(lubridate) # 读取并预处理数据集 DS_F_norm_sel <- read.csv("https://raw.githubusercontent.com/Leprechault/trash/main/indexes_dates_bug.csv") DS_F_norm_sel <- DS_F_norm_sel %>% select(STAND, DATE, STATUS, SAVI_MAX, MSR_SD, GCI_SD) %>% mutate(DATE = ymd(DATE)) # 生成目标数据集 new.DS_F_norm_sel <- DS_F_norm_sel %>% group_by(STAND) %>% summarize( # 生成每周间隔的日期序列 DATE = seq(from = min(DATE), to = max(DATE), by = "week"), # 保留原数据集的其他列,这里取每组第一个值,可按需调整 STATUS = first(STATUS), SAVI_MAX = first(SAVI_MAX), MSR_SD = first(MSR_SD), GCI_SD = first(GCI_SD) ) %>% ungroup() # 查看结果示例 head(new.DS_F_norm_sel)
代码逻辑说明
- 分组处理:通过
group_by(STAND)对每个地块单独处理; - 生成周间隔日期:调用
seq()函数,指定by = "week"生成每周的日期序列,起止点为该地块的最早、最晚记录日期; - 保留原结构列:使用
first()提取每组原数据中的对应列值(如果同一地块的其他列存在多值,可根据实际需求替换为mean()、last()等聚合逻辑); - 取消分组:最后用
ungroup()解除分组,得到常规数据框结构。
内容的提问来源于stack exchange,提问作者Leprechault
相关产品推荐
相关产品推荐

