如何在R语言中从数据框抽取未被采样过的新样本
解决方法
情况1:已抽取第一份样本(sample),需排除后抽取新样本
由于原数据exec_names的每行是唯一个体(即使execid重复,行索引仍有区分),可通过以下两种方式实现:
基础R实现
先定位原数据中未被抽中的行,再从中抽样:
# 获取原数据中不在已抽样本里的行索引 remaining_rows <- which(!rownames(exec_names) %in% rownames(sample)) # 从剩余行中抽取100行 new_sample <- exec_names[sample(remaining_rows, 100), ]
dplyr包实现(更直观)
若习惯使用tidyverse工具,用anti_join筛选未被抽样的行后再抽取:
library(dplyr) # 筛选原数据中不在已抽样本内的所有行 remaining_data <- anti_join(exec_names, sample, by = c("execid", "exec_fname", "coname_execucomp")) # 从剩余数据中抽取100行 new_sample <- remaining_data %>% sample_n(100)
注意:如果数据存在完全重复的行(所有列值均一致),
anti_join会排除所有重复项,此时建议用行索引的方法更精准。
情况2:提前规划抽样(更稳妥)
如果还未抽取第一份样本,或想重新规范流程,可先生成全局随机索引分组,确保两份样本完全不重叠:
# 生成所有行的随机顺序索引 all_indices <- sample(nrow(exec_names)) # 第一份100行样本 sample1 <- exec_names[all_indices[1:100], ] # 第二份100行样本(从剩余行中选取) sample2 <- exec_names[all_indices[101:200], ]
这种方式从根源避免了重复抽样问题,适合需要多份独立不重叠样本的场景。
内容的提问来源于stack exchange,提问作者bear_525
相关产品推荐
相关产品推荐

