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

如何在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对应一次完整的置换结果,可用于后续的参考模型分析。

对原代码问题的修正

  1. 原代码中nested_obsdata属于笔误,应为nested_data;
  2. 无需额外计算sample.sizes,因为每个pair的样本量可通过n()直接获取;
  3. 不需要使用n_sample(),直接用base R的sample()函数即可实现同pair内date.time的随机重排。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:55:23