r - 以变量/列达到某个平均值为条件对特定数量的 tibble 行进行采样
问题描述
我有一个包含很多行的数据集(~500000)。该数据集的“X”列的平均值为 4.5。我想对数据集(没有替换)进行采样,使其具有大约 50000 行,同时达到大约 3.5 的“X”平均值。
我将如何在 R 中以相当快的方式做到这一点?
解决方案
由于 OP 的唯一标准是在不考虑分散的情况下使样本均值接近 3.5,因此这是一种可能的方法:
- 计算与 3.5 的偏差,
- 按此偏差对数据进行排序,
- 计算 X 的累积平均值,按与 3.5 的绝对偏差排序,
- 在对数据进行采样之前,对数据进行子集化,使其累积平均值约为 3.5。
代码:
library(data.table)
nr <- 5e5
ns <- 5e4
DT <- data.table(X=rnorm(nr, 4.5))
target <- 3.5
dev <- 0.05
setorder(DT[, absDev := abs(X - target)], absDev)
DT[, cummean := cumsum(X) / seq_len(.N)]
x <- DT[(target-dev) <= cummean & cummean <= (target+dev), sample(X, ns)]
mean(x)
#[1] 3.549371
推荐阅读
- windows - 尝试在 win10/64bit 上构建 objectbox 失败
- if-statement - 消息内容检查器无法正常工作 discord.py
- javascript - 嵌套的 forEach 在 Javascript 中无法按预期工作
- c++ - powershell 和 c++ INTEROP 上的语法错误
- python - 确定 a、b 和 c 中是否存在数字 n1、n2 使得 n1 + n2 = n3 [ftt,多项式乘法]
- mips - 为什么 MIPS 流水线有内存读取信号,但没有寄存器读取信号?
- sql - 自引用表中子项的 SQLite 总和
- javascript - 将compressorjs与React Native expo一起使用
- linux - 使用不同前缀将 dns 指向不同的服务
- swift - (UTI) 的重置为默认的 xcode 新项目字段?或者我哪里出错了?