假设我有以下因素列表:
factor_1 = c("A1", "A2", "A3")
factor_2 = c("B1", "B2")
factor_3 = c("C1", "C2", "C3", "C4")
factor_4 = c("D1", "D2", "D3")
我制作了以下数据框,其中包含这些因素的所有 (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
我想随机将此数据 (data_exp) 拆分为 3 个数据集,以便每一行仅出现在这些数据集之一中 - 此外,这 3 个数据集不必具有相同的大小。我尝试使用以下代码来执行此操作。
首先,我随机生成 3 个随机数,对应于每个数据集的行数,使得这 3 个随机数相加为 72:
# https://stackoverflow.com/questions/24845909/generate-n-random-integers-that-sum-to-m-in-r
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
接下来,我尝试使用这些随机数创建这些数据集:
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]), ]
- 这种方法的问题在于
data_1, data_2, data_3
具有公共行,并且并非 data_exp 中的所有行都必须存在于data_1, data_2, data_3
.
有办法解决这个问题吗?
谢谢你!