如何在R的嵌套tibble中为每个pair重分配随机date.time至type?
解决方案
核心需求是每个pair内部独立地将date.time随机分配给原有type(即保持type不变,仅打乱同pair内的date.time与type的对应关系),并重复该操作10000次生成置换参考模型。以下是基于dplyr、purrr和tidyr的实现方案:
步骤1:加载依赖包
library(dplyr) library(purrr) library(tidyr)
步骤2:定义单次置换函数
这个函数接收单个pair的子数据集,返回置换后的结果:保持type列不变,对date.time列进行无放回随机重排,实现type与date.time的随机配对。
shuffle_dates_by_pair <- function(df_sub) { df_sub %>% mutate(date.time = sample(date.time, size = n(), replace = FALSE)) }
步骤3:生成10000次置换样本
通过crossing创建置换编号,再结合map重复执行置换操作,最后整理成结构化的数据集:
# 原始数据 df <- data.frame(pair=c("AB", "AB", "AB", "AB", "CD", "CD", "DE", "DE", "DE"), type=c("PR", "NN", "AP", "PX", "BK", "PX", "NN", "NN", "S2"), date.time=c("2021-04-05_17:50:42", "2021-04-05_17:00:03", "2021-04-05_15:36:00", "2021-04-05_15:20:13", "2021-04-05_16:40:14", "2021-04-05_16:11:21", "2021-04-05_17:00:03", "2021-04-05_16:40:14", "2021-04-05_17:00:03")) # 生成10000次置换结果 permuted_models <- crossing(perm_id = 1:10000) %>% mutate(permuted_data = map(perm_id, ~ { df %>% group_by(pair) %>% group_modify(~ shuffle_dates_by_pair(.x)) %>% ungroup() })) %>% unnest(permuted_data)
代码说明
group_modify:用于对每个group(即每个pair)应用置换函数,确保每个pair内部独立操作。crossing(perm_id = 1:10000):创建10000个置换编号,用于区分不同的置换样本。map:对每个置换编号执行一次全数据集的分组置换操作,保证每次置换都是独立的。
结果说明
最终的permuted_models数据框包含四列:perm_id(置换样本编号,1到10000)、pair、type、date.time。每个perm_id对应一次完整的置换结果,可用于后续的参考模型分析。
对原代码问题的修正
- 原代码中
nested_obsdata属于笔误,应为nested_data; - 无需额外计算
sample.sizes,因为每个pair的样本量可通过n()直接获取; - 不需要使用
n_sample(),直接用base R的sample()函数即可实现同pair内date.time的随机重排。
内容的提问来源于stack exchange,提问作者monkparakeet
相关产品推荐
相关产品推荐

