【问题标题】:Conditional Matrix or Combinations in RR中的条件矩阵或组合
【发布时间】:2018-11-13 22:49:14
【问题描述】:

我有 7 个向量:

vector1 = c(9,8,7,6,5)
vector2 = c(10,20,30)
vector3=c(19,27,34,40,45)
vector4=c(29,37,44)
vector5=c(39,47)
vector6=c(28,36)
vector7=c(13,42)
vector=c(vector1,vector2,vector3,vector4,vector5,vector6,vector7)

co = expand.grid(vector,vector,vector,vector,vector,vector)

我需要一个上述向量的 6 变量组合表,但每个向量中的值在该表的每一行中不应重复超过 2 次,并且每一行中不应出现相同的数字。例如:

V1 V1 V2 V3 V4 V7

V1 V3 V4 V5 V6 V7

我该怎么做?

V1 = c (9,8,7,6,5)
V2 = c (10,20,30)
V3 = c (19,27,34,40,45)
V4 = c (29,37,44)
V5 = c (39.47)
V6 = c (28.36)
V7 = c (13,25,42)

我有 7 个向量组。我想将它们与 6 个变量结合起来列出。这 7 个组中的每一行的成员不得超过 2 人。

作为第二个条件,

x1 = 1: 9
x2 = 10:19
x3 = 20:29
x4 = 30: 39
x5 = 40:49

我有如上所示的组。组合列表中每一行的 x1、x2、x3、x4 或 x5 组范围内的成员不应超过 3 个。

例如:在 2 3 5 7 19 25 的组合中,x1 成员的数量不应在组合列表中,因为它们超过 3。

【问题讨论】:

  • 您需要符合这些要求的所有组合吗?或者只是一种从中取样的方法? (顺序并不重要,对吧?)
  • 试试combn(paste0("V", c(1:7, 1:7)), m = 6)。或者unique(lapply(combn(paste0("V", c(1:7, 1:7)), m = 6, simplify = FALSE), sort))
  • 我不太清楚你所说的 是什么意思,并且每一行中不应该出现相同的数字”,但我上面的评论似乎是你想要的?
  • 谢谢格雷戈尔。它有效,但我还有更多问题要解决。
  • @Tim ,您能否用一个较小的示例编辑您的问题,并在您尝试过的内容中包含所需的输出。就目前而言,与您的 cmets 一起,尚不清楚您在问什么。

标签: r matrix conditional combinations


【解决方案1】:

这是一个想法。这不是一个很好的答案,因为我没有完全测试它,但我认为它应该可以工作。它的效率相当低,而且我没有耐心让它运行足够长的时间来完成。

y = rep(vector, 2)
result = unique(
  lapply(
    Filter(f = function(x) !anyDuplicated(x),
     combn(y, m = 6, simplify = FALSE)
    ),
  sort)
)

说明:将所有输入复制到一个向量中。生成选择 6 个元素的所有组合。过滤掉任何重复的结果。对它们进行排序,使其顺序一致。保留唯一的组合。

这是低效的,因为第一步将生成choose(length(y), 6) ~= 7M 组合,然后我们必须减少到(我认为)166,638 个最终组合。但这是我能想到的对您的要求进行编码的最简单方法。

【讨论】:

  • 感谢您对@Gregor 的关注,但这不是我想要的。这段代码防止重复组合,但没有提供我上面提到的两个条件。我希望 vector1,2,3,4,5,6,7 成员在同一行中不要重复超过 2 次,并且 1:9、10:19 ......不要重复数字超过 3 次。例如: 1. 如果条件是 v1 = c (14,15,17,19),我希望每行最多有 2 个这样的数字。例如:我不想让 11、13、15、17 与第二个条件在同一行。
  • 嗯,我想我错过了你的编辑,只满足第一个条件。我会将部分答案作为任何想要更多工作的人的起点。
  • 谢谢@Gregor
  • 另外,我很困惑44 同时在 V4 和 V7 中。这是如何运作的? 44可以因此而重复吗?我的回答当然没有考虑到这一点。
  • 其实这两个向量中的44个是没有问题的。当然,数字 44 不能是 2 在同一行。我写了数据集作为例子。我可以更改 44。事实上,44 不应该在 2 向量上。但是,v4 和 v7 的 3 个号码在同一行中的成员不应超过 2 个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
相关资源
最近更新 更多