【问题标题】:Enumeration of distinct events in RR中不同事件的枚举
【发布时间】:2013-04-25 13:22:04
【问题描述】:

我正在寻找一种通用方法来枚举与以下问题相关的序列并将结果存放在 R 中的 3 维矩阵中。

我认为必须有一个组合解决方案,但我一直找不到。希望下面详述的内容将充分描述该问题。欢迎任何帮助。

假设有 n 个周期和 c 个不同的区域,其中事件 e 的发生必须在每个区域中恰好发生一次,那么可能的序列的枚举是什么?

例如,如果有 3 个时间段 {1,2,3} 和 2 个区域 {a,b},手动枚举解决方案给出:

Period 1    2    3
Area   a b  a b  a b
Sol 1  e e  - -  - -   ; ie event occurs in both areas at time 1, nothing happens at time 2 and 3
Sol 2  - -  e e  - -   ; event occurs in both areas at time 2 etc
Sol 3  - -  - -  e e
Sol 4  e -  - e  - -
Sol 5  e -  - -  - e
Sol 6  - e  e -  - -
Sol 7  - e  - -  e -
Sol 8  - -  e -  - e
Sol 9  - -  - e  e -

无论区域数和时间步数如何,我所知道的是解决方案的数量将始终为 n^c。对于这种情况,事件在“a”中发生的 3 种方式乘以事件在“b”中发生的 3 种方式,3 x 3 = 9 个不同的序列。如前所述,我希望为任意数量的周期和任意数量的区域实施通用解决方案,并将结果存储在由 [time][area][sequence] 索引的矩阵中。谢谢!

【问题讨论】:

  • 这几乎可以肯定是来自@GavinSimpson 的permute 库的工作

标签: r permutation combinations


【解决方案1】:

非常感谢。我相信以下工作正常。

# Solution:
numperiods <- 4
numevents <- 2
numseqs <- numperiods^numevents

gridparam <- rep(list(seq(numperiods)),numevents)
g <- as.matrix(expand.grid(gridparam))
print(g)

m <- t(apply(g, 1, 
         function(z) {
            x <- rep(0, numperiods*numevents) 
            for (i in 1:numseqs) 
            {
              x[numevents * z[i] - (numevents-i)] <- 1
            }
            x
         }))
print(m)

result <- array(m,c(numseqs,numevents,numperiods))
colnames(result) <- outer("Event",1:numevents, paste)
rownames(result) <- outer("Seq", 1:numseqs, paste)
# Time period is third dim
print(result)

【讨论】:

    【解决方案2】:

    所以有两个事件,每个事件都可能发生在三个时期之一。您可以使用expand.grid 枚举发生这两个事件的所有可能的时段组合:

    g <- as.matrix(expand.grid( seq(3), seq(3) ))
    print(g)
          Var1 Var2
     [1,]    1    1
     [2,]    2    1
     [3,]    3    1    
     [4,]    1    2
     [5,]    2    2
     [6,]    3    2
     [7,]    1    3
     [8,]    2    3
     [9,]    3    3
    

    现在遍历g 的行并返回在正确索引处具有 1(“事件”)的向量:

    m <- t(apply(g, 1, 
                 function(z) {
                   x <- rep(0, 6)
                   x[2 * z[1] - 1] <- 1
                   x[2 * z[2]] <- 1
                   x
                 }))
    print(m)
          [,1] [,2] [,3] [,4] [,5] [,6]
     [1,]    1    1    0    0    0    0
     [2,]    0    1    1    0    0    0
     [3,]    0    1    0    0    1    0
     [4,]    1    0    0    1    0    0
     [5,]    0    0    1    1    0    0
     [6,]    0    0    0    1    1    0
     [7,]    1    0    0    0    0    1
     [8,]    0    0    1    0    0    1
     [9,]    0    0    0    0    1    1
    

    这是您要查找的二进制形式的矩阵。

    如果您有超过 2 个事件,请在 expand.grid 内添加另一个 seq(3),并在 apply 内调整功能。同样,如果超过 3 个句点,请将 seq(3) 更改为 seq(number.of.periods)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      相关资源
      最近更新 更多