如何用R语言从每3行生物重复组中随机抽取1行至测试数据集
R语言实现按组抽取测试集(每3行一组)
核心思路
先为数据框添加每3行一组的分组标识,再针对每个组随机抽取1行作为测试数据,剩余行保留为训练数据。
方法一:基础R实现(无需额外包)
# 确保数据框行数为3的倍数(若不符合需先处理) stopifnot(nrow(df) %% 3 == 0) # 生成分组标识(每3行对应一个组) group_ids <- gl(nrow(df)/3, 3) # 抽取每个组的随机行索引 sample_rows <- unlist(tapply(seq_len(nrow(df)), group_ids, function(x) sample(x, 1))) # 拆分测试集与训练集 df_test <- df[sample_rows, ] df_train <- df[-sample_rows, ]
方法二:dplyr包实现(代码更简洁)
library(dplyr) # 确保数据框行数为3的倍数 stopifnot(nrow(df) %% 3 == 0) # 生成分组并抽取测试集 df_test <- df %>% mutate(group = rep(1:(nrow(.)/3), each = 3)) %>% group_by(group) %>% sample_n(size = 1) %>% ungroup() %>% select(-group) # 从原数据框中移除测试集行,得到训练集 df_train <- df %>% anti_join(df_test, by = names(df))
注意事项
- 如果原始数据框行数不是3的倍数,需先处理多余行(如删除或合并),否则分组逻辑会出错。
- 若不想修改原数据框,基础R方法中可以直接用临时生成的
group_ids分组,无需添加新列。
内容的提问来源于stack exchange,提问作者purple1437
相关产品推荐
相关产品推荐

