按r中的列对排列表中产生相似元素频率的n行进行抽样



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

最新更新