2010-11-27 9 views
1

これは私がこのことを理解するのに長い時間を要しているとは思えません。ベクトルが行列に含まれていることを確認してくださいR

私はベクトルのコレクションを保持し、後で特定のベクトルがそのコレクションにあることを確認する必要があります。 %in%と組み合わせたリストを試しましたが、正しく動作していないようです。

私の次のアイデアは、行列とそれにrbindベクトルを作成することでしたが、ベクトルが行列に含まれているかどうかを確認する方法はわかりません。 %inは、正確な行ではなく、セットを比較しているようです。同じことが交差に適用されるようです。

大変助けてください!

+0

やプログラミング言語は何してくださいある上で交差()を使用する方法ですか? – kellogs

+0

言語はRです。 – dmkc

答えて

7

あなたはこのように意味するか:あなたがする必要がある場合は

myMat2 <- matrix(unlist(myList), ncol = 3) 
## As the vectors are now in the cols, we use apply over the cols 
apply(myMat, 2, function(x, want) isTRUE(all.equal(x, want)), wantVec) 
## or 
any(apply(myMat, 2, function(x, want) isTRUE(all.equal(x, want)), wantVec)) 

myMat <- matrix(unlist(myList), ncol = 3, byrow = TRUE) 
## As the vectors are now in the rows, we use apply over the rows 
apply(myMat, 1, function(x, want) isTRUE(all.equal(x, want)), wantVec) 
## or 
any(apply(myMat, 1, function(x, want) isTRUE(all.equal(x, want)), wantVec)) 

または列によって:

wantVec <- c(3,1,2) 
myList <- list(A = c(1:3), B = c(3,1,2), C = c(2,3,1)) 
sapply(myList, function(x, want) isTRUE(all.equal(x, want)), wantVec) 
## or, is the vector in the set? 
any(sapply(myList, function(x, want) isTRUE(all.equal(x, want)), wantVec)) 

私たちは、マトリックスと同様のことを行うことができますこれはたくさん、あなた自身の関数を書いてください

vecMatch <- function(x, want) { 
    isTRUE(all.equal(x, want)) 
} 

などです。

> sapply(myList, vecMatch, wantVec) 
    A  B  C 
FALSE TRUE FALSE 
> any(sapply(myList, vecMatch, wantVec)) 
[1] TRUE 

あるいは全部をラップ:リストmyList

vecMatch <- function(x, want) { 
    out <- sapply(x, function(x, want) isTRUE(all.equal(x, want)), want) 
    any(out) 
} 

> vecMatch(myList, wantVec) 
[1] TRUE 
> vecMatch(myList, 5:3) 
[1] FALSE 

編集:私はall.equal()通話に巻き付けisTRUE()を使用する理由にクイックコメント。それの引数がTRUEときに限り、それはTRUEを返すため

> all.equal(1:3, c(3,2,1)) 
[1] "Mean relative difference: 1" 

isTRUE()は、ここに役立ちます。これは、2つの引数はない等しいところ、all.equal()が論理値(FALSE)を返していないという事実によるものであり、それ以外の場合はFALSEを返します。

0
> M 
    [,1] [,2] [,3] 
[1,] 1 4 7 
[2,] 2 5 8 
[3,] 3 6 9 


v <- c(2, 5, 8) 

チェック各列:ここ

c1 <- which(M[, 1] == v[1]) 
c2 <- which(M[, 2] == v[2]) 
c3 <- which(M[, 3] == v[3]) 

はまだ2つの以上の要素

> intersect(intersect(c1, c2), c3) 

[1] 2 
関連する問題