Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 从两个向量中采样唯一对_R - Fatal编程技术网

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的评论有人解决了这个问题,今晚我会睡不着的。