如何在R中抽样使样本某列和接近指定值并满足观测数范围?
嘿,这个需求我帮你搞定~ 咱们可以用随机抽样+循环校验的方式来实现,既能满足总和的误差要求,又能控制样本数量范围。下面是具体的代码和思路:
步骤1:定义核心参数
先把需求转化为可配置的参数,方便后续根据实际数据调整:
# 目标总和 target_sum <- 100000 # 允许的误差范围:±10% error_range <- c(target_sum * (1 - 0.1), target_sum * (1 + 0.1)) # 样本数量范围(示例20行数据设为1-2,因为原数据value值偏大,凑10万左右的话只能选1或2个;500行全量数据改成45-65即可) n_min <- 1 n_max <- 2
注意:你提供的示例数据里单个
value值普遍偏大(最小都有5万+),所以我把样本数量范围调成了1-2,不然根本凑不出10万±10%的总和。实际使用时根据你的真实数据调整参数就行。
步骤2:循环抽样直到符合条件
因为是随机抽样,我们需要多次尝试,直到抽到同时满足两个条件的样本。为了避免无限循环,我加了最大尝试次数的限制:
# 初始化结果变量 selected_sample <- NULL # 最大尝试次数,防止无限循环 max_tries <- 10000 tries <- 0 # 循环抽样 while(is.null(selected_sample) && tries < max_tries) { tries <- tries + 1 # 随机选一个符合数量范围的样本量 sample_n <- sample(n_min:n_max, 1) # 随机抽取对应数量的行 candidate <- x[sample(nrow(x), sample_n), ] # 计算当前样本的value总和 sum_val <- sum(candidate$value) # 检查是否符合总和条件 if(sum_val >= error_range[1] && sum_val <= error_range[2]) { selected_sample <- candidate } } # 输出结果 if(is.null(selected_sample)) { cat("尝试了", max_tries, "次后仍未找到符合条件的样本,请检查参数设置是否合理\n") } else { cat("找到符合条件的样本:\n") print(selected_sample) cat("\n样本总和:", round(sum_val, 2), "\n") cat("样本数量:", nrow(selected_sample), "\n") }
代码逻辑解释
- 每次循环会随机挑选一个在
n_min到n_max之间的样本量,然后抽取对应行数的数据 - 计算该样本的
value总和,判断是否落在允许的误差区间内 - 如果符合条件,就把这个样本保存下来并跳出循环;如果尝试了
max_tries次还没找到,就提示参数可能需要调整
运行结果示例
用你提供的示例数据运行,会得到类似这样的结果(随机抽样,每次结果不同):
找到符合条件的样本: # A tibble: 1 × 2 id value <int> <dbl> 1 17 106241. 样本总和: 106241.04 样本数量: 1
内容的提问来源于stack exchange,提问作者David Metcalf
相关产品推荐
相关产品推荐

