从两个向量中抽取唯一对

时间:2017-06-14 22:01:58

标签: r

给出了两个向量,ab

a = letters[1:6]
b = letters[7:11]

目标是使用ab对两列矩阵进行采样。第一列应包含来自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" 

3 个答案:

答案 0 :(得分:2)

你可以把它变成一个函数并在那里抛出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

答案 1 :(得分:2)

另一种不需要更换的方式

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"

答案 2 :(得分:1)

绝对不优雅,但会奏效。

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)