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

如何用dplyr的slice_sample从两个指定时间窗口各抽取一个时间点?

解决方案

要实现从每个dataID的两个指定时间窗口各随机抽取一个样本,你需要先给数据标记所属窗口,再按**dataID+窗口**的组合分组抽样,而不是仅按dataID分组抽2个。具体步骤如下:

1. 标记时间窗口

首先需要根据时间列判断每条数据属于哪个窗口(W1/W2):

  • 如果你的时间列是相对于起始点的时长(小时),直接用case_when标记:
library(dplyr)

processed_data <- data %>%
  # 标记每条数据所属窗口,不在目标窗口的标记为NA
  mutate(
    window = case_when(
      # W1:10分钟(即10/60≈0.1667小时)到2小时
      time_elapsed >= 10/60 & time_elapsed <= 2 ~ "W1",
      # W2:2.5小时到4.5小时
      time_elapsed >= 2.5 & time_elapsed <= 4.5 ~ "W2",
      # 其他时间标记为NA,后续过滤掉
      TRUE ~ NA_character_
    )
  ) %>%
  # 过滤掉不在目标窗口的数据
  filter(!is.na(window))
  • 如果你的时间列是POSIXct格式的具体时间,需要先计算每个时间点相对于组内起始时间的时长:
processed_data <- data %>%
  group_by(dataID) %>%
  # 计算每个时间点相对于组内最早时间的小时数
  mutate(
    start_time = min(time),
    time_elapsed = difftime(time, start_time, units = "hours") %>% as.numeric()
  ) %>%
  ungroup() %>%
  # 标记窗口(同上面的逻辑)
  mutate(
    window = case_when(
      time_elapsed >= 10/60 & time_elapsed <= 2 ~ "W1",
      time_elapsed >= 2.5 & time_elapsed <= 4.5 ~ "W2",
      TRUE ~ NA_character_
    )
  ) %>%
  filter(!is.na(window))

2. 按组合分组抽样

接下来按dataID和window双重分组,每个分组随机抽取1个样本,这样就能保证每个dataID的两个窗口各有一个样本:

final_result <- processed_data %>%
  group_by(dataID, window) %>%
  slice_sample(n = 1) %>%
  ungroup()

说明

  • 双重分组确保了抽样范围被限制在每个dataID的单个窗口内,避免出现两个样本来自同一窗口的情况;
  • 过滤掉不在目标窗口的数据,防止抽到无关样本;
  • 如果某个dataID的某个窗口没有数据,该分组会被自动跳过,你可以根据需求添加drop = FALSE保留空分组,或者提前检查数据完整性。

内容的提问来源于stack exchange,提问作者DelonixRex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 17:15:11