我正在使用 R 并面临以下组合问题。初始情况是一个包含 512 行的数据框,其中包含数字 1 到 8 的所有可能的三重组合:
expand.grid(rep(list(1:8), 3))
现在我想从这个数据框中抽取 420 行,以便每列中每个数字的频率尽可能相似。
随机生成的表格看起来像这样并且包含 - 取决于机会 - 非常波动的频率。
expand.grid(rep(list(1:8), 3)) %>%
filter(row_number() %in% sample(1:nrow(.), 420))
是否存在某种约束以获得尽可能相等的频率?
编辑: 但是,结果不一定是随机的。有没有办法以最大相等的频率过滤 420 行?
分层抽样
注意
expand.grid
使变量第一个变化最快,最后一个最慢...使用分层抽样,将行分成 8*8=64 组,分层,并从每个组中抽取 6 或 7 个样本,因为
420/64
[1] 6.5625
R 代码如下:
set.seed(7 * 11 * 13)
G <- expand.grid(rep(list(1:8), 3))
M <- matrix(1:512, 64, 8, byrow=TRUE)
rows <- apply(M, 1, \(x) sample(x, ifelse(runif(1) <= 0.5, 6, 7))) |> unlist()
m <- length(rows)
DIFF <- setdiff(1:512, rows)
morerows <- sample(DIFF, 420 - m)
rows <- c(rows, morerows)
GG <- G[rows, ]
然后查看每个变量的频率表:
lapply(GG, table)
$Var1
1 2 3 4 5 6 7 8
55 49 53 52 50 54 51 56
$Var2
1 2 3 4 5 6 7 8
51 54 53 54 51 51 52 54
$Var3
1 2 3 4 5 6 7 8
53 53 50 54 54 54 50 52