2017-01-11 15 views
0

この質問は何度も尋ねられているはずですが、私はQuestions that may already have your answerを成功裏に検索しています。特定のエントリに関係するR行列のサブセット化列

行列の列をブール演算子(subset()を使用せずに)でサブセット化するにはどうすればよいですか?

> m = matrix(c("A", "B", "B", "B", "C", "A", "C", "C", "D"), nrow = 3) 
> m 
    [,1] [,2] [,3] 
[1,] "A" "B" "C" 
[2,] "B" "C" "C" 
[3,] "B" "A" "D" 

列は何の名前を持っていない、と私はいくつかのエントリに値「D」を含む任意の列を望んでいることに注意してください。

たとえば、this postでは、grades[grades[,"pass"] == 2,]と呼び出します。呼び出しが行を抽出することと、passが単一の列を参照しているという事実とは別に、列の名前はありません。

私が試してみました:

> m[m == "D", ] 
Error in m[m == "D", ] : (subscript) logical subscript too long 

> m[which(m=="D"), ] 
Error in m[which(m == "D"), ] : subscript out of bounds 

> m = as.data.frame(m) # Turning the matrix into a df 
> m[m == "D", ] 
    V1 V2 V3 
NA <NA> <NA> <NA> 

答えて

1

これは別の方法です。

m[, colSums(m == "D") > 0, drop=FALSE] 
    [,1] 
[1,] "C" 
[2,] "C" 
[3,] "D" 

m==D次いでcolSumsがTRUEsの数をカウントし、論理的なマトリックスを構築します。次に、anyが0より大きいかどうかがチェックされます。このチェックの結果は、マトリックスをサブセット化するために使用されます。 @ cdetermanの答えに続いて、行列構造を保存するためにdrop = FALSEを追加しました。

+0

本当にエレガント!ありがとうございました! – Toni

2

あなたはそれらの列の要素やインデックスを検索するapplyコールを使用することができます。

m[,apply(m, MARGIN = 2, function(x) any(x == "D")), drop = FALSE] 

    [,1] 
[1,] "C" 
[2,] "C" 
[3,] "D" 

注 - drop = FALSE引数が存在することがわかります。これは、列が1つしかない場合、出力がまだ行列であることを確認するためです。

+0

ありがとうございます。これは、それをサブセット化する痛い方法の1つです。あなたは非常に正しいかもしれないので、これを批判として誤解しないでください。Rは特に簡単ではありません...「MARGIN = 2」は、列を欲しいという概念を導入していますか? – Toni

+0

正しいですが、 'MARGIN'は行または列の上にあるかどうかを示します。これはドキュメントで見ることができます。 – cdeterman

+0

@トーニ、これがあなたの質問を満たしていれば、この答えを受け入れるようにしてください。 – cdeterman

関連する問題