以 variable/column 达到某个平均值为条件对特定数量的 tibble 行进行采样

Sample a specific number of tibble rows conditional to a variable/column reaching a certain mean value

我有一个包含很多行 (~500000) 的数据集。此数据集的列 "X" 的平均值为 4.5。 我想对数据集(不替换)进行采样,使其具有大约 50000 行,同时达到 "X" 的平均值,大约为 3.5。

我如何在 R 中以相当快的方式做到这一点?

由于 OP 的唯一标准是使样本均值接近 3.5,而不考虑分散性,因此这是一种可能的方法:

  1. 计算与3.5的偏差,
  2. 按此偏差对数据进行排序,
  3. 计算 X 的累积平均值,按与 3.5 的绝对偏差排序,
  4. 在对数据进行采样之前,对数据进行子集化,使累积平均值约为 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