假设我有一个字符向量(例如myv = c('a', 'b', 'c', 'd', 'e')
),我想从该向量中随机生成n = length(myv)
对partner1 - partner2
,知道:
partner1
和1次partner2
,不得多于或少于;partner1
并且partner2
不起作用)。我没有找到一种完美的方法(例如sample
,使用combn
或expand.grid
),因此我目前使用了一个丑陋的for
循环:
set.seed(11)
myv = letters[1:5]
irand = sample(length(myv), length(myv)) # to randomly select partner1
allpairs = expand.grid(myv, myv)
# remove pairs of the same item
allpairs = allpairs[allpairs[,1]!=allpairs[,2],]
usedpartner2 = c() # to store the partner2 which are already used
mypairs = c() # to store results
for (i in 1:length(myv)) {
partner1 = myv[irand[i]]
# the potential partner2 must be different from partner1 and not already used
candidates = allpairs[allpairs[, 1]==partner1 & !(allpairs[, 2] %in% usedpartner2), 2]
partner2 = as.character(candidates[sample(length(candidates), 1)])
usedpartner2 = c(usedpartner2, partner2)
mypairs = rbind(mypairs, c(partner1, partner2))
}
mypairs
# [,1] [,2]
# [1,] "b" "e"
# [2,] "a" "b"
# [3,] "e" "a"
# [4,] "d" "c"
# [5,] "c" "d"
您可以将其myv
视为环,并通过在molulo(%%
)中添加length(myv)
(不包括零)将其随机旋转。(length(myv) - 1) %% length(myv)
应排除在外,以避免元素与自身配对。这应该myv
分别与和的任意长度一起工作。
matrix(c(myv,
myv[(seq_along(myv) + sample(seq_along(myv)[- (length(myv) - 1)], 1))
%% length(myv) + 1]),
ncol=2)
然后,您可以轻松地将其包装为一个函数。
pairOff <- function(x) {
x <- sample(x) # to get first column into random order, too
M <- matrix(c(x,
x[(seq_along(x) + sample(seq_along(x)[- (length(x) - 1)], 1))
%% length(x) + 1]),
ncol=2)
return(M)
}
屈服
> pairOff(myv)
[,1] [,2]
[1,] "d" "e"
[2,] "c" "a"
[3,] "b" "d"
[4,] "e" "c"
[5,] "a" "b"
数据
set.seed(165472)
myv <- letters[1:5]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句