R语言中使用sample_n()抽取数据表半数行后,如何获取剩余另一半行
半量随机抽样后获取剩余行的R实现方法
核心逻辑
直接通过已抽取样本的行标识做差集筛选,从原数据表中拿出所有不属于已抽样本的行,两个子集完全互斥,既不会重复也不会遗漏。
具体操作写法
- 普通data.frame对象场景
原数据表为df,已经通过sample_n()抽好的半量子集存在half1中,直接通过行名匹配取反即可拿到剩余行:half2 <- df[!rownames(df) %in% rownames(half1), ] - Tibble/tidyverse生态场景
Tibble默认没有可直接匹配的稳定行名,容易出现匹配错位,更稳妥的实现流程:- 给原表新增临时行号标识列
df <- df %>% mutate(.tmp_row = row_number()) - 正常调用
sample_n()完成半量抽样half1 <- df %>% sample_n(size = floor(nrow(df)/2)) - 按行号差集筛选剩余样本,最后删掉临时列
half2 <- df %>% filter(!(.tmp_row %in% half1$.tmp_row)) %>% select(-.tmp_row)
- 给原表新增临时行号标识列
常见注意点
- 抽样前必须通过
set.seed()固定随机种子,保证拆分结果可复现 - 若原表行数为奇数,抽样时用
floor()/ceiling()调整抽样量,避免因size为小数触发sample_n()报错 - 不要在抽完一半后再独立抽一次另一半,两次独立随机抽样必然会出现行重复、遗漏,达不到严格等大拆分的效果
内容的提问来源于stack exchange,提问作者devan
相关产品推荐
相关产品推荐

