当前位置: 首页 > 知识库问答 >
问题:

如何找到两个列表的所有对,并在不重复的情况下对它们进行分类?

太叔经赋
2023-03-14

我们正在为一个项目做准备,在这个项目中,18个人应该以一种方式讨论话题,在每一轮中他们结成一对,然后他们交换话题,直到每个人都与每个人交谈。这意味着153场讨论,每轮9对平行对话,共17轮。我试图制定一个矩阵,显示谁应该和谁说话,以避免混乱,但没有成功。为了简单起见,每个人都有一个数字,所以底线是,我需要从1到18的所有数字组合对(使用combn函数),但是这些对应该在17轮中重新排列,以便每个数字每轮只出现一次。有什么想法吗?

共有1个答案

侯善
2023-03-14

让我们首先来看一个关于6人的简单问题。以下矩阵列出了在哪一轮(条目)中与谁(行)交谈的人(列):

例如,在第1轮(黄色)中,我们有以下几对:

(1-2), (3-5), (4-6)

对于第二轮(绿色),我们将:

(1-3), (2-6), (4-5)

等等

因此,我们基本上是在寻找一个对称的拉丁方(即,在每行和每列中,每个条目只出现一次,参见维基百科上的拉丁方)。

方框中的拉丁方可以通过加法表轻松生成:

inner_ls <- function(k) {
  res <- outer(0:(k-1), 0:(k-1), function(i, j) (i + j) %% k)
  ## replace zeros by k
  res[res == 0] <- k
  ## replace diagonal by NA
  diag(res) <- NA
  res
}

inner_ls(5)
#      [,1] [,2] [,3] [,4] [,5]
# [1,]   NA    1    2    3    4
# [2,]    1   NA    3    4    5
# [3,]    2    3   NA    5    1
# [4,]    3    4    5   NA    2
# [5,]    4    5    1    2   NA

因此,只剩下最后一行(列)追加缺少的整数:

full_ls <- function(k) {
  i_ls <- inner_ls(k - 1)
  last_row <- apply(i_ls, 1, function(row) {
    rounds <- 1:(k - 1)
    rounds[!rounds %in% row]
  })
  res <- cbind(rbind(i_ls, last_row), c(last_row, NA))
  rownames(res) <- colnames(res) <- 1:k
  res
}

full_ls(6)

#    1  2  3  4  5  6
# 1 NA  1  2  3  4  5
# 2  1 NA  3  4  5  2
# 3  2  3 NA  5  1  4
# 4  3  4  5 NA  2  1
# 5  4  5  1  2 NA  3
# 6  5  2  4  1  3 NA

这样,你得到你的分配矩阵如下:

full_ls(18)

#     1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18
# 1  NA  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17
# 2   1 NA  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17  2
# 3   2  3 NA  5  6  7  8  9 10 11 12 13 14 15 16 17  1  4
# 4   3  4  5 NA  7  8  9 10 11 12 13 14 15 16 17  1  2  6
# 5   4  5  6  7 NA  9 10 11 12 13 14 15 16 17  1  2  3  8
# 6   5  6  7  8  9 NA 11 12 13 14 15 16 17  1  2  3  4 10
# 7   6  7  8  9 10 11 NA 13 14 15 16 17  1  2  3  4  5 12
# 8   7  8  9 10 11 12 13 NA 15 16 17  1  2  3  4  5  6 14
# 9   8  9 10 11 12 13 14 15 NA 17  1  2  3  4  5  6  7 16
# 10  9 10 11 12 13 14 15 16 17 NA  2  3  4  5  6  7  8  1
# 11 10 11 12 13 14 15 16 17  1  2 NA  4  5  6  7  8  9  3
# 12 11 12 13 14 15 16 17  1  2  3  4 NA  6  7  8  9 10  5
# 13 12 13 14 15 16 17  1  2  3  4  5  6 NA  8  9 10 11  7
# 14 13 14 15 16 17  1  2  3  4  5  6  7  8 NA 10 11 12  9
# 15 14 15 16 17  1  2  3  4  5  6  7  8  9 10 NA 12 13 11
# 16 15 16 17  1  2  3  4  5  6  7  8  9 10 11 12 NA 14 13
# 17 16 17  1  2  3  4  5  6  7  8  9 10 11 12 13 14 NA 15
# 18 17  2  4  6  8 10 12 14 16  1  3  5  7  9 11 13 15 NA

 类似资料:
  • 我有一个csv文件,我想对第一列进行排序(从最大到最大)。第一列的名称是“CRIM”。 我可以阅读第一列,但我无法对其进行排序,数字是浮点数。 另外,我想找到列表的中位数。 这就是我到目前为止所做的:

  • 问题内容: 我知道我可以用来将字符串字段设置为 特定新索引中的新字段 。 有没有办法将此设置 全局 应用-即为任何新索引中的任何字符串字段设置属性?(无需为每个新索引设置它) 问题答案: 是的,你可以通过创建一个实现这个指标模板上有一个映射类型和动态模板 然后,您可以在任何新索引中创建任何文档,并且所有字符串字段都将为 如果检查新创建的映射类型,则将看到该字段为

  • 我正在实现一个排序列表类,在这个类中,我将对任何类型的对象进行排序,所以现在我想测试对象是否具有可比性, 我用这段代码覆盖了compareTo()方法:- 所以现在我需要给这些对象分配数字,像这样 但它总是给我一个例外:- 线程“main”中出现异常Java . lang . classcastexception:Java . lang . integer不能转换为java.lang.String

  • 问题内容: 如何在Python列表中找到重复项并创建另一个重复项列表?该列表仅包含整数。 问题答案: 要删除重复项,请使用set(a)。要打印副本,请执行以下操作: 请注意,这Counter并不是特别有效(计时),并且在这里可能会过大。set会表现更好。此代码按源顺序计算唯一元素的列表: 或者,更简洁地说: 我不建议你使用后一种样式,因为这样做并不明显(方法始终返回None,因此需要not)。 要

  • 我的老师想让我通过迭代找到用户10个输入的中位数。 这就是我使用迭代来查找总和,奇数数,最大值和质数数的方式。但我一直坚持要找到中位数。

  • 问题内容: 我一直在寻找一种不用使用collections.sort就可以对数组列表进行排序的方法,因为我自己的逻辑有缺陷,而且我遇到了很多麻烦。 我需要对它进行排序,以便可以使用我创建的一种方法,该方法基本上可以执行collections.swap的工作,以便对数组列表进行完全排序。 这是我的代码: 我对此一直很烦恼。抱歉,这是在伤害社区。 问题答案: 我想,你希望下面的算法:在阵列的其余部分发

  • 为了简单起见,我试图组合两个不同对象的列表,我将它们称为和,最后根据它们的日期值对组合列表进行排序。我已经在这里看到了大部分的答案,但它们并没有展示如何正确实现这样的用例的全貌。 我还实现了一个自定义类,它处理两个给定列表的合并和排序。我们将其称为。使用下面实现的方法。 这就是问题所在,因为我在上得到一个错误,“reason:没有变量类型的实例存在,所以对象符合接口”

  • rbindlist做的正是我需要的,但'do.call'做不到! do.Call不是我想要的