以下是一个看似简单的谜题,我很难弄清楚如何解决。任何帮助将不胜感激。
我有一个矩阵,其尺寸为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
答案 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