【问题标题】:Assign two variables to each other without duplicates | Create groups of two in R将两个变量相互赋值,不重复 |在 R 中创建两个组
【发布时间】:2017-10-17 12:42:14
【问题描述】:

我想随机分配成员。然而,这个问题似乎比最初预期的要棘手。 combn和sampledon'r 因为重复而工作。如果一个成员被分配给另一个成员,则不能以第三个身份结束。

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

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,我的df 中可能会或可能不会以NA 结束。有没有更优雅的解决方案? 输出可以是成对的list 或data.frame 等。

谢谢

编辑

我可能不仅会得到NA,还会得到非镜像对,我想防止这种情况发生。

【问题讨论】:

  • 你能展示一下预期的结果吗?
  • 匹配是否有意“镜像”(例如 1/7 和 7/1)?
  • 我刚做了。预期的结果应该如上所示(它使用那个循环和那个set.seed)。每对数字出现两次:{3,6} 和 ´{6,3}`
  • 乔普,他们应该被镜像。把它想象成人。第 1 个人与第 7 个人交谈(以及 7 对 1)。

标签: r combinations


【解决方案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

【讨论】:

  • 这正是我想要阻止的。例如,数字 2 在一个包含 9 和 10 的集合中。但是:每对数字应该只出现两次:{3,6} 和 ´{6,3}`
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 2021-11-28
  • 1970-01-01
  • 2022-10-24
相关资源
最近更新 更多