解决方案
t(replicate(20, sample(c(1, 1.2, sample(c(1, 1.2), 8, replace = TRUE)))))
说明
sample(c(1, 1.2, sample(c(1, 1.2), 8, replace = TRUE)))
创建一个随机排序的 10 个样本,确保其中一个元素为 1,其中一个元素为 1.2,另外 8 个元素从 1 和 1.2 中随机选择。
t(replicate(20, sample(c(1, 1.2, sample(c(1, 1.2), 8, replace = TRUE)))))
这样做 20 次,然后将答案转换为您想要的尺寸。
更新
在额外的 cmets 之后,您似乎需要能够完成两件不同的事情:
- 创建一个 n × m 矩阵,随机填充 x 的值,但要满足以下条件:结果矩阵的每一行至少包含一次 x 的每个元素。
- 创建一个 n x m 矩阵,其中随机填充 x 的值,但要满足结果矩阵的每一行具有多个唯一值的约束。
所以,在这一点上,我建议创建函数:
f1 <- function(x, n, m) {
N <- length(x)
if ( N > m ) {
stop('x is longer than the number of columns requested.', call. = FALSE)
}
return(t(replicate(n, sample(c(x, sample(x, m - N, replace = TRUE))))))
}
f2 <- function(x, n, m) {
if ( length(unique(x)) == 1 ) {
stop('x has only one unique element.', call. = FALSE)
}
result <- t(replicate(n, sample(x, m, replace = TRUE)))
while ( any(apply(result, 1, function(x) length(unique(result)) == 1)) ) {
result <- t(replicate(n, sample(x, m, replace = TRUE)))
}
return(result)
}
(如果我是你,我也会给这些函数起更多信息的名称)。
f1() 完成了我对任意x、n 和m 的原始答案(对应于上面的数字1)。 f2() 完成新的请求(对应上面的2号);但是,请注意可能有更好的方法来完成此任务,并且此方法(while 循环)可能需要任意时间,具体取决于x、n、m 和机会的值。以下是函数的示例调用:
set.seed(1234)
x <- c(1, 1.2)
f1(x, 20, 10)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1.2 1.2 1.2 1.2 1.2 1.0 1.2 1.0 1.0 1.0
[2,] 1.0 1.0 1.0 1.0 1.0 1.2 1.0 1.0 1.0 1.2
[3,] 1.0 1.2 1.2 1.2 1.2 1.2 1.0 1.0 1.2 1.0
[4,] 1.2 1.0 1.2 1.0 1.2 1.0 1.2 1.2 1.0 1.0
[5,] 1.2 1.0 1.2 1.2 1.0 1.0 1.2 1.0 1.0 1.0
[6,] 1.2 1.0 1.0 1.0 1.2 1.0 1.2 1.0 1.0 1.0
[7,] 1.2 1.0 1.0 1.0 1.2 1.2 1.0 1.0 1.0 1.2
[8,] 1.0 1.0 1.2 1.0 1.2 1.2 1.0 1.0 1.0 1.2
[9,] 1.0 1.2 1.2 1.2 1.2 1.2 1.0 1.2 1.0 1.0
[10,] 1.0 1.2 1.2 1.0 1.0 1.0 1.2 1.0 1.0 1.0
[11,] 1.0 1.2 1.0 1.2 1.0 1.2 1.2 1.0 1.2 1.0
[12,] 1.2 1.2 1.2 1.0 1.2 1.2 1.0 1.2 1.2 1.2
[13,] 1.2 1.0 1.0 1.2 1.2 1.0 1.2 1.0 1.0 1.0
[14,] 1.2 1.0 1.2 1.0 1.2 1.0 1.0 1.0 1.2 1.0
[15,] 1.2 1.0 1.0 1.2 1.2 1.2 1.0 1.0 1.0 1.0
[16,] 1.0 1.2 1.2 1.2 1.2 1.0 1.2 1.0 1.0 1.2
[17,] 1.2 1.2 1.0 1.2 1.2 1.2 1.0 1.2 1.2 1.0
[18,] 1.2 1.0 1.0 1.0 1.2 1.2 1.0 1.2 1.2 1.2
[19,] 1.2 1.2 1.0 1.0 1.2 1.0 1.2 1.2 1.0 1.0
[20,] 1.2 1.0 1.2 1.0 1.0 1.2 1.0 1.2 1.0 1.2
x <- c(1, 1.2, 1.4, 1.6, 1.8, 2, 2.2, 2.4, 2.6, 2.8, 3)
f2(x, 20, 10)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1.0 2.2 2.0 1.6 2.8 3.0 2.4 1.4 2.8 2.4
[2,] 3.0 1.4 2.8 2.0 1.6 1.8 2.6 1.2 1.8 2.4
[3,] 1.6 1.4 1.0 1.2 1.4 1.2 2.4 1.4 3.0 3.0
[4,] 2.4 2.6 2.6 2.4 1.2 3.0 2.2 2.0 1.0 1.8
[5,] 2.4 1.8 2.6 2.6 2.2 1.4 2.6 1.2 2.2 1.8
[6,] 2.6 2.6 3.0 1.4 2.8 1.8 2.0 2.6 1.2 1.8
[7,] 2.4 2.8 1.6 1.2 3.0 1.4 1.0 1.8 1.6 1.6
[8,] 2.4 2.6 1.8 3.0 1.4 2.4 1.8 3.0 2.6 2.2
[9,] 2.6 2.8 2.6 2.0 3.0 2.2 2.8 2.2 2.2 1.0
[10,] 1.4 2.6 3.0 3.0 2.6 2.4 1.4 2.2 2.2 1.0
[11,] 1.8 2.8 1.8 2.0 1.2 1.4 2.2 1.8 2.2 2.2
[12,] 1.2 1.6 1.0 3.0 1.8 3.0 2.0 2.0 2.4 1.2
[13,] 2.0 2.2 2.4 1.8 1.2 1.0 2.6 2.4 2.6 1.2
[14,] 2.2 2.6 3.0 1.6 2.4 1.6 2.2 1.0 2.2 2.2
[15,] 2.4 2.6 2.8 1.0 2.4 2.8 2.6 2.8 1.2 2.6
[16,] 1.6 3.0 3.0 2.2 1.2 2.6 2.2 1.0 2.4 1.6
[17,] 2.8 1.4 1.6 3.0 2.2 2.6 1.0 1.0 2.2 1.4
[18,] 1.4 2.2 1.8 2.6 1.2 3.0 2.4 2.4 2.6 2.0
[19,] 1.8 2.2 3.0 1.4 2.6 1.8 2.8 2.8 3.0 3.0
[20,] 1.4 1.4 2.6 1.2 2.8 3.0 2.0 1.0 2.2 2.8