如何为R数据集生成指定工作日的前后日期行并随机抽样
R数据集扩展与抽样处理方案
需求说明
- 针对包含
date(日期)和dow(星期几)字段的R数据集,完成以下操作:
- 为每条原始记录,生成其对应星期几的前4个、后4个同星期日期,将这些日期行与原记录行合并
- 新增行添加
event字段:原记录行标记event=1,新增行标记event=0;其余字段完全继承原记录的数值 - 从每条原记录生成的8条新增行中随机抽取4条,最终每条原记录对应5行数据(1条原行+4条随机选中的新增行)
代码实现
使用data.table和lubridate包完成操作,代码逻辑贴合示例格式:
# 加载依赖包 library(data.table) library(lubridate) # 假设原始数据集为dt1,先确保date是日期格式 dt1[, date := ymd(date)] # 步骤1+2:生成前后同星期日期并合并,添加event字段 dt3 <- dt1[, { current_date <- date # 生成前4个同星期日期(每次减7天) prev_dates <- current_date - days(7*(1:4)) # 生成后4个同星期日期(每次加7天) next_dates <- current_date + days(7*(1:4)) # 合并所有日期:原日期+前后4个日期 all_dates <- c(prev_dates, current_date, next_dates) # 生成event标记:原日期为1,其余为0 event <- as.integer(all_dates == current_date) # 构造新表,继承原字段并替换date、添加event .SD[rep(.I, length(all_dates))][, `:=`(date = all_dates, event = event)] }, by = .(id, date)] # 按每条原始记录唯一标识分组 # 步骤3:从新增行中随机抽取4条,保留原行 dt4 <- dt3[, { original_row <- .SD[event == 1] new_rows <- .SD[event == 0] # 随机抽取4条新增行 sampled_new <- new_rows[sample(.N, 4)] # 合并原行与抽样行 rbind(original_row, sampled_new) }, by = .(id, date_of_onset)] # 按原记录的唯一标识分组(可根据实际调整)
示例输出
原始数据集(部分)
> head(dt1[, 1:7]) id duplicate_ data di na dow year month date_of_on 1: 1 <NA> <NA> Tuesday 2011 5 2011-05-03 2: 2 <NA> <NA> Saturday 2011 12 2011-12-10
扩展后数据集(部分)
> head(dt3[1:10, 1:7]) date year month day dow id date_of_onset event 1: 2011-04-05 2011 4 5 Tuesday 1 2011-05-03 0 2: 2011-04-12 2011 4 12 Tuesday 1 2011-05-03 0 3: 2011-04-19 2011 4 19 Tuesday 1 2011-05-03 0 4: 2011-04-26 2011 4 26 Tuesday 1 2011-05-03 0 5: 2011-05-03 2011 5 3 Tuesday 1 2011-05-03 1 6: 2011-05-10 2011 5 10 Tuesday 1 2011-05-03 0 7: 2011-05-17 2011 5 17 Tuesday 1 2011-05-03 0 8: 2011-05-24 2011 5 24 Tuesday 1 2011-05-03 0 9: 2011-05-31 2011 5 31 Tuesday 1 2011-05-03 0
抽样后数据集(部分)
> head(dt4[1:10, 1:7]) date year month day dow id date_of_onset event 1: 2011-04-05 2011 4 5 Tuesday 1 2011-05-03 0 2: 2011-04-19 2011 4 19 Tuesday 1 2011-05-03 0 3: 2011-05-03 2011 5 3 Tuesday 1 2011-05-03 1 4: 2011-05-10 2011 5 10 Tuesday 1 2011-05-03 0 5: 2011-05-24 2011 5 24 Tuesday 1 2011-05-03 0
内容的提问来源于Stack Exchange,提问作者Alessio
相关产品推荐
相关产品推荐

