查找每列行值的组合,以使列具有唯一的行

时间:2015-02-12 22:26:51

标签: r

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

我有一个矩阵,其尺寸为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

1 个答案:

答案 0 :(得分: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