2013-05-20 58 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