将两个变量彼此分配而不重复|在R中创建两个组

时间:2017-10-17 12:42:14

标签: r combinations

我想随意将成员分配给对方。但是,问题似乎比原先预期的要复杂。 combnsample由于重复而无法工作。如果某个成员被分配到另一个成员,则不能以第三个身份结束。

我有一个非常粗鲁的解决方法来说明我想要的东西:

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,还可以使用非镜像对,我希望这样做。

1 个答案:

答案 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