R语言如何根据已存储的入样概率向量抽取数据框样本
结论
你现有的s <- sample_n(df$col1, 3)命令无法直接修改实现该需求,这个函数本身是做随机抽样用的,不支持按预先指定的固定入样位置精确提取行。
实现方法
你的需求本质是按0/1入样标识的位置,精确匹配提取数据框对应行,不需要用到随机抽样函数,直接用R原生的行索引逻辑就能实现:
- 首先确认你的入样标识向量长度和数据框
df的行数完全一致,且顺序和数据框行一一对应(你示例中长度为10的向量对应10行数据框是符合要求的) - 假设你的入样标识向量命名为
in_sample,直接用逻辑索引提取即可:
# 原生R实现,最简洁 s <- df[as.logical(in_sample), ]
以你给出的示例向量c(0,0,1,0,1,1,0,0,0,0)为例,as.logical()会把向量里的1转为TRUE、0转为FALSE,R会自动保留索引为TRUE的行,也就是你要的第3、5、6行,完全匹配需求。
如果你习惯用dplyr风格的语法,也可以用过滤的方式实现:
# dplyr实现 library(dplyr) s <- df %>% filter(as.logical(in_sample))
为什么sample_n不适用
sample_n是dplyr提供的随机抽样函数,本身的逻辑是按指定规则从数据框中随机抽取固定数量的行:
- 你写的
sample_n(df$col1, 3)本身用法有误,该函数第一个参数应该传入整个数据框,而非单独某一列 - 哪怕调整正确用法、给函数传入入样概率权重,也只能改变每行被抽中的概率,无法强制精确抽中你预先标记为1的固定行,结果仍然是随机的,不符合你的需求。
注意事项
- 不要随意调整入样标识向量的顺序,否则会出现行匹配错位的问题
- 如果你的入样标识是之前通过概率抽样计算得到的结果,用上述方法提取的行是100%匹配抽样结果的,不存在随机误差
内容的提问来源于stack exchange,提问作者Egon Carter
相关产品推荐
相关产品推荐

