如何实现非随机抽样?有序拆分等规模样本的技术求助
问题解答:非随机抽样方法 + 有序拆分等规模样本
嘿,我来帮你搞定这两个问题!
一、非随机抽样的常见实用方法
非随机抽样是不依赖随机选择的抽样方式,常用于特定场景,常见类型有:
- 便利抽样:怎么方便怎么来,比如街头拦人做调研、用身边同事当样本。优点是快、成本低,但样本代表性差,结果容易有偏差。
- 判断抽样(目的抽样):靠研究者的经验和判断选样本,比如研究高端消费行为时专门选奢侈品店的顾客,适合针对性强的研究,但结果好坏全看研究者的水平。
- 配额抽样:先按关键特征(比如年龄、性别、收入)分层,给每层分配固定数量的名额,再在每层里非随机选样本。比便利抽样靠谱些,但还是没法完全避免主观偏差。
- 滚雪球抽样:先找到几个符合条件的样本,再让他们介绍同类型的人,特别适合找那些难接触的群体,比如小众职业、隐性疾病患者。
二、R语言中排序后保持顺序拆分等规模样本
你的需求是先排序,再拆成等规模样本且不打乱顺序,这个其实很简单,我一步步给你写代码:
首先先把你的数据补全并排序:
# 你的原始数据 acct_num <- c('4525','52222','22892','67181','67733','737382', '5534','2228','7282','45622') Probability <- runif(10, min = 0, max = 10) acct_details <- data.frame(acct_num, Probability) # 按Probability升序排序(要降序的话加decreasing=TRUE) acct_sorted <- acct_details[order(acct_details$Probability), ]
方法1:手动拆分(适合固定组数)
比如你要拆成2组,每组5条,直接按切片取就行,完全保持顺序:
group1 <- acct_sorted[1:5, ] group2 <- acct_sorted[6:10, ]
方法2:通用拆分函数(适合任意可整除的组数)
如果想灵活调整组数,写个小函数就搞定,还能自动检查是否能拆分等规模样本:
split_ordered <- function(df, num_groups) { # 先检查总样本数能不能被组数整除 if (nrow(df) %% num_groups != 0) { stop("总样本数不能被组数整除,没法拆成等规模样本哦!") } # 计算每组的大小 group_size <- nrow(df) / num_groups # 生成连续的分组标签(比如1,1,2,2...) groups <- rep(1:num_groups, each = group_size) # 拆分数据,完美保持排序后的顺序 split(df, groups) } # 示例:拆成5组,每组2条 split_result <- split_ordered(acct_sorted, 5) # 查看拆分后的结果 split_result
这个函数的逻辑是给排序后的每一行分配连续的分组编号,然后用split拆分,这样每个组里的元素都是排序后的连续片段,绝对不会打乱顺序。如果总样本数没法被组数整除,函数会直接报错提醒你调整组数~
内容的提问来源于stack exchange,提问作者Sugand Anand




