如何用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
相关产品推荐
相关产品推荐

