R 从两个向量中采样唯一对
给定两个向量,R 从两个向量中采样唯一对,r,R,给定两个向量,a和b a = letters[1:6] b = letters[7:11] 目标是使用a和b对两列矩阵进行采样。第一列应包含a中的元素,以便a中的每个元素重复两次。第二列应包含b中的元素,以便b中的每个元素也至少重复两次。另一个条件是,对必须是唯一的 我已经知道如何对12对进行采样,但还没有弄清楚如何确保它们始终是唯一的。例如,在下面给出的解决方案中,第3行和第11行是相同的 所需的输出不应有重复的行 set.seed(42) m = cbind(sample(c(a, a))
a
和b
a = letters[1:6]
b = letters[7:11]
目标是使用a
和b
对两列矩阵进行采样。第一列应包含a
中的元素,以便a
中的每个元素重复两次。第二列应包含b
中的元素,以便b
中的每个元素也至少重复两次。另一个条件是,对必须是唯一的
我已经知道如何对12对进行采样,但还没有弄清楚如何确保它们始终是唯一的。例如,在下面给出的解决方案中,第3行和第11行是相同的
所需的输出不应有重复的行
set.seed(42)
m = cbind(sample(c(a, a)), sample(c(b, b, sample(b, 2, replace = TRUE))))
m
# [,1] [,2]
# [1,] "e" "g"
# [2,] "f" "k"
# [3,] "c" "k"
# [4,] "b" "h"
# [5,] "f" "j"
# [6,] "d" "i"
# [7,] "e" "h"
# [8,] "a" "g"
# [9,] "d" "h"
#[10,] "a" "i"
#[11,] "c" "k"
#[12,] "b" "j"
绝对不优雅,但会起作用
a = letters[1:6]
b = letters[7:11]
asamp <- sample(c(a,a))
finished <- F
while(!finished) {
bsamp <- sample(c(b, b, sample(b, 2, replace = TRUE)))
if(length(unique(paste(asamp,bsamp)))==12) finished <- T
}
cbind(asamp,bsamp)
a=字母[1:6]
b=字母[7:11]
一旦amp您可以将其设置为函数并在其中抛出replace
,即
f1 <- function(a, b){
m <- cbind(sample(c(a, a)), sample(c(b, b, sample(b, 2, replace = TRUE))))
m[,2] <-replace(m[,2], duplicated(m), sample(b[!b %in% m[duplicated(m),2]], 1))
return(m)
}
#which seems stable
sum(duplicated(f1(a, b)))
#[1] 0
sum(duplicated(f1(a, b)))
#[1] 0
sum(duplicated(f1(a, b)))
#[1] 0
sum(duplicated(f1(a, b)))
#[1] 0
f1另一种不需要更换的方式
m = rbind(
c(1,1,0,0,0),
c(1,1,0,0,0),
c(0,0,1,1,0),
c(0,0,1,1,0),
c(0,0,0,0,1),
c(0,0,0,0,1)
)
# One "free" selection in each of the last two rows
m[5, sample(4,1)] = 1
m[6, sample(4,1)] = 1
# Scramble it while preserving row/column sums
m = m[sample(6), sample(5)]
> as.matrix(expand.grid(a=a,b=b))[as.logical(m),]
# a b
# [1,] "a" "g"
# [2,] "b" "g"
# [3,] "e" "g"
# [4,] "c" "h"
# [5,] "d" "h"
# [6,] "f" "h"
# [7,] "d" "i"
# [8,] "f" "i"
# [9,] "b" "j"
#[10,] "c" "j"
#[11,] "a" "k"
#[12,] "e" "k"
哦,刚刚看到@Sotos的评论有人解决了这个问题,今晚我会睡不着的。