【问题标题】:Finding combinations of per-column row values such that columns have unique rows查找每列行值的组合,使列具有唯一行
【发布时间】:2015-02-12 22:26:51
【问题描述】:

以下是一个看似简单的谜题,我很难弄清楚如何解决。任何帮助将不胜感激。

我有一个维度为 m=n 的 T/F 值的矩阵。例如。

tf.m2 = matrix(c(F,T,T,F,T,T,F,F,F), ncol = 3)

      [,1]  [,2]  [,3]
[1,] FALSE FALSE FALSE
[2,]  TRUE  TRUE FALSE
[3,]  TRUE  TRUE FALSE

目标是为每一列选择一个值为 TRUE 的行,这样没有列使用相同的行。 这很难传达,因此我在下面为上述矩阵提供了所需的解决方案。

goal = rbind(c(2,3,1), c(3,2,1))

     [,1] [,2] [,3]
[1,]    2    3    NA
[2,]    3    2    NA

在这里,每一行都是不同的解决方案;每个解决方案都是原始矩阵中每一列中行值的可接受组合,因此没有组合使用同一行两次。例如。 c(2,2,NA) 不是解决方案。

我真的用这个把头撞在墙上了。这看起来很简单,而且很可能是。我就是不明白。

这也是我真实数据中的一个非玩具示例。

  tf.m2.l = matrix(c(F,T,F,F,T,F,T,F,F,F,F,T,F,T,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F), ncol = 7)

      [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]
[1,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[2,]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[4,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[5,]  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE
[6,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[7,]  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE


  goal.l = rbind(c(2,5,NA,NA,NA,NA,NA), c(2,7,NA,NA,NA,NA,NA), c(5,7,NA,NA,NA,NA,NA), c(7,5,NA,NA,NA,NA,NA))

     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    2    5   NA   NA   NA   NA   NA
[2,]    2    7   NA   NA   NA   NA   NA
[3,]    5    7   NA   NA   NA   NA   NA
[4,]    7    5   NA   NA   NA   NA   NA

【问题讨论】:

    标签: r


    【解决方案1】:

    这是我想出的。我知道这很简单。很抱歉造成混乱,希望有一天能对某人有所帮助。

      row.poss = alply(tf.m2.l, 2, function(x){
        if (!any(x)) { return(NA) }
        which(x)
      })
      poss.grid = expand.grid(row.poss)
      poss.grid.rep = adply(poss.grid, 1, function(x) {
        if(any(count(na.omit(unlist(x)))[,"freq"] > 1)) return(NULL)
        x
      })
    poss.grid.rep
    
      1 2  3  4  5  6  7
    1 2 5 NA NA NA NA NA
    2 7 5 NA NA NA NA NA
    3 2 7 NA NA NA NA NA
    4 5 7 NA NA NA NA NA
    

    【讨论】:

    • 原来这种方法不能很好地缩放,因为 dim(M) 并且 TRUE 值的数量增加了。 grid.expand 生成一个包含 100,000 行的中间矩阵,其中 M=14 和 sum(M)=36。然后,aaply 步骤非常缓慢。我正在寻找不重复行值的修改 grid.expand、删除重复项的快速方法或替代解决方案。
    猜你喜欢
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    相关资源
    最近更新 更多