我正在使用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