组合物品

sta*_*oob 7 random integer r data-manipulation

假设我有以下因素列表:

factor_1 = c("A1", "A2", "A3")
factor_2 = c("B1", "B2")
factor_3 = c("C1", "C2", "C3", "C4")
factor_4 = c("D1", "D2", "D3")
Run Code Online (Sandbox Code Playgroud)

我制作了以下数据框,其中包含这些因素的所有 (3 * 2 * 4 * 3 = ) 72 种组合:

data_exp <- expand.grid(factor_1, factor_2, factor_3, factor_4) 
data_exp$id = 1:nrow(data_exp)

> head(data_exp)
  Var1 Var2 Var3 Var4 id
1   A1   B1   C1   D1  1
2   A2   B1   C1   D1  2
3   A3   B1   C1   D1  3
4   A1   B2   C1   D1  4
5   A2   B2   C1   D1  5
6   A3   B2   C1   D1  6
Run Code Online (Sandbox Code Playgroud)

我想随机将此数据 (data_exp) 拆分为 3 个数据集,以便每一行仅出现在这些数据集之一中 - 此外,这 3 个数据集不必具有相同的大小。我尝试使用以下代码来执行此操作。

首先,我随机生成 3 个随机数,对应于每个数据集的行数,使得这 3 个随机数相加为 72:

# /sf/ask/1739213661/

rand_vect <- function(N, M, sd = 1, pos.only = TRUE) {
  vec <- rnorm(N, M/N, sd)
  if (abs(sum(vec)) < 0.01) vec <- vec + 1
  vec <- round(vec / sum(vec) * M)
  deviation <- M - sum(vec)
  for (. in seq_len(abs(deviation))) {
    vec[i] <- vec[i <- sample(N, 1)] + sign(deviation)
  }
  if (pos.only) while (any(vec < 0)) {
    negs <- vec < 0
    pos  <- vec > 0
    vec[negs][i] <- vec[negs][i <- sample(sum(negs), 1)] + 1
    vec[pos][i]  <- vec[pos ][i <- sample(sum(pos ), 1)] - 1
  }
  vec
}

r = rand_vect(3, 72)
[1] 26 23 23
Run Code Online (Sandbox Code Playgroud)

接下来,我尝试使用这些随机数创建这些数据集:

data_1 = data_exp[sample(nrow(data_exp), r[1]), ]
data_2 = data_exp[sample(nrow(data_exp), r[2]), ]
data_3 = data_exp[sample(nrow(data_exp), r[3]), ]
Run Code Online (Sandbox Code Playgroud)
  • 这种方法的问题是data_1, data_2, data_3具有公共行,并且并非 data_exp 中的所有行都必然存在于data_1, data_2, data_3.

有办法解决这个问题吗?

谢谢你!

Ony*_*mbu 7

使用以下内容:

 n <- 3
 split(data_exp, sample(rep(seq(n), rmultinom(1, nrow(data_exp), rep(1, n)))))
Run Code Online (Sandbox Code Playgroud)