You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为R数据集生成指定工作日的前后日期行并随机抽样

R数据集扩展与抽样处理方案

需求说明

  • 针对包含date(日期)和dow(星期几)字段的R数据集,完成以下操作:
  1. 为每条原始记录,生成其对应星期几的前4个、后4个同星期日期,将这些日期行与原记录行合并
  2. 新增行添加event字段:原记录行标记event=1,新增行标记event=0;其余字段完全继承原记录的数值
  3. 从每条原记录生成的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 15:45:26