我想随意将成员分配给对方。但是,问题似乎比原先预期的要复杂。 combn
和sample
由于重复而无法工作。如果某个成员被分配到另一个成员,则不能以第三个身份结束。
我有一个非常粗鲁的解决方法来说明我想要的东西:
groupmembers <- 10
set <- 1:groupmembers
df <- data.frame(g1=set, g2=NA)
for(i in 1:(nrow(df)/2)){
set.seed(137)
draw <- sample(set, 1)
while(draw==i) draw <- sample(set, 1)
df[i,2] <- draw
df[which(df[,1]==draw),2] <- df$g1[i]
set <- set[-which(set %in% as.numeric(df[i,]))]
}
g1 g2
1 1 7
2 2 8
3 3 6
4 4 9
5 5 10
6 6 3
7 7 1
8 8 2
9 9 4
10 10 5
有了这个set.seed
,我得到了我想要的东西。但是,如果我更改set.seed
,我可能会或可能不会在NA
中使用df
。有更优雅的解决方案吗?
输出可以是list
对或data.frame
等。
由于
修改
我不仅可以使用NA
,还可以使用非镜像对,我希望这样做。
答案 0 :(得分:1)
这个怎么样:
groupmembers <- 10
set <- 1:groupmembers
df <- data.frame(g1 = set, g2 = set)
while(any(df[,1] == df[,2])){
df[,2] <- sample(df[,2])
}
修改强>
或者,如果您只想获得“相等对”(例如10/2和2/10),您可以尝试这样做:
group1 <- set[sample(set,length(set)/2)]
group2 <- set[!set %in% group1]
df <- data.frame(g1 = c(group1,group2), f2 = c(group2,group1))
g1 f2
1 10 2
2 3 4
3 7 5
4 9 6
5 1 8
6 2 10
7 4 3
8 5 7
9 6 9
10 8 1