2013-05-20 59 views
0

我有一个矩阵和一个向量,其具有的值:搜索具有给定的值的行的矩阵以任何顺序

mat<-matrix(c(1,1,6, 
       3,5,2, 
       1,6,5, 
       2,2,7, 
       8,6,1),nrow=5,ncol=3,byrow=T) 

vec<-c(1,6) 

这是由N矩阵A N的一小部分和1乘N向量。有没有办法让我可以用vec中的值对行进行子集划分?

这样做,我知道的是使用子集函数的最直接的方式:

subset(mat,vec[,1] == 1 & vec[,2] == 6) #etc etc 

与子问题是你必须预先指定列查找和具体组合来做。我面临的问题是以这样一种方式构建的,即我想以任何可能的方式查找包含“vec”中的数字的所有行。所以在上面的例子中,我想要得到一个返回矩阵:

1,1,6 
1,6,5 
8,6,1 

任何想法?

+0

这是三个原因一个坏榜样:1)你说你的大案例有一个N乘N矩阵和一个N长矢量,那你为什么不用你的例子? 2)无论您需要匹配其中一个值还是全部,预期输出都是相同的。你接受里卡多的回答,没有注意到他的代码是返回行,只有一个值匹配......现在修复了。 3)你没有描述'vec'会多次包含相同值的特殊情况。 – flodel

回答

1

你可以做

apply(mat, 1, function(x) all(vec %in% x)) 
# [1] TRUE FALSE TRUE FALSE TRUE 

,但这可能会产生意外的结果,如果vec包含重复的值:

vec <- c(1, 1) 
apply(mat, 1, function(x) all(vec %in% x)) 
# [1] TRUE FALSE TRUE FALSE TRUE 

,所以你将不得不使用table考虑重复使用更复杂的东西:

vec <- c(1, 1) 
is.sub.table <- function(table1, table2) { 
    all(names(table1) %in% names(table2)) && 
    all(table1 <= table2[names(table1)]) 
} 
apply(mat, 1, function(x)is.sub.table(table(vec), table(x))) 
# [1] TRUE FALSE FALSE FALSE FALSE 

然而,如果向量长度等于在矩阵的列数,你似乎表明,但不是在你的榜样的情况下,你应该做的:

vec <- c(1, 6, 1) 
apply(mat, 1, function(x) all(sort(vec) == sort(x))) 
# [1] TRUE FALSE FALSE FALSE FALSE 
+0

我编辑,因为我不认为你正确理解这个问题。 OP希望查找来自'vec'的所有*号码被找到的行,而不是* one *。如果是我不明白的人,请随时发布。 – flodel

+0

@ flodel,有趣..不,我没有得到这一点。我看到的唯一迹象是OP使用'&',我抛弃了不正确的使用。但事实上,你可能是对的 –

+0

对不起,我的向量不会包含重复的值,因为它们实际上是索引号的组合。我应该提供一个更清晰的示例问题。 – user1234440