排列表中的 n 行样本导致 R 中各列的相似元素频率

问题描述 投票:0回答:1

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

r permutation combinatorics
1个回答
0
投票

分层抽样

注意

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 
© www.soinside.com 2019 - 2024. All rights reserved.