如何为Stack Overflow生成含多被试的R大型数据框可复现数据?
生成多被试可复现数据的实用方法
针对你用head()只能导出单被试数据、导致模型无法运行的问题,这里有几种靠谱的替代方案:
1. 直接抽取多被试的样本数据
放弃用head(),改为按被试分组抽取,保证输出数据包含多个被试:
# 设置随机种子,确保每次抽取结果一致 set.seed(123) # 随机挑选3个不同的被试ID selected_subjects <- sample(unique(td_pref_all$subject), 3) # 提取这3个被试的所有数据(或取前N行) mini_data <- td_pref_all[td_pref_all$subject %in% selected_subjects, ] # 如果想控制每个被试的行数,比如每个取15行 mini_data <- do.call(rbind, lapply(selected_subjects, function(sub) { head(td_pref_all[td_pref_all$subject == sub, ], 15) })) # 导出可复现数据 dput(mini_data)
2. 基于现有数据模拟多被试
如果不想公开真实数据,可以用现有单被试的数据做模板,生成模拟的多被试数据,保留原数据结构:
# 取单被试的前10行作为模板 template_data <- td_pref_all[td_pref_all$subject == "CC_86", ][1:10, ] # 生成3个新被试ID new_subs <- paste0("CC_", sample(100:200, 3)) # 复制模板并替换被试专属信息 simulated_data <- do.call(rbind, lapply(new_subs, function(sub) { temp <- template_data temp$subject <- sub temp$sub_num <- sample(1:50, 1) temp$age <- sample(18:30, 1) temp$rating <- sample(1:5, nrow(temp), replace = TRUE) # 模拟评分数据 temp })) # 合并原模板和模拟数据,得到多被试示例 final_mini_data <- rbind(template_data, simulated_data) dput(final_mini_data)
3. 用dplyr简化抽样(适合熟悉tidyverse的用户)
用dplyr的分组抽样功能,代码更简洁:
library(dplyr) set.seed(123) mini_data <- td_pref_all %>% group_by(subject) %>% slice_sample(n = 15) %>% # 每个被试抽15行 ungroup() %>% filter(subject %in% sample(unique(subject), 3)) # 筛选3个被试 dput(mini_data)
4. 生成极简多被试结构示例
如果模型只需要"多被试"的结构验证,不需要大量观测,可以生成每个被试仅2-3行的极小数据集:
set.seed(456) mini_structure <- td_pref_all %>% distinct(subject, .keep_all = TRUE) %>% # 每个被试取第一行 slice_sample(n = 3) %>% # 选3个被试 # 给第一个被试再加两行,保证每个被试有重复观测 rbind(td_pref_all %>% filter(subject == first(mini_structure$subject)) %>% slice(2:3)) dput(mini_structure)
内容的提问来源于stack exchange,提问作者Shannon Cahalan
相关产品推荐
相关产品推荐

