web-dev-qa-db-ja.com

条件を満たす行列の行を選択する

行列を持つRでは:

     one two three four
 [1,]   1   6    11   16
 [2,]   2   7    12   17
 [3,]   3   8    11   18
 [4,]   4   9    11   19
 [5,]   5  10    15   20

行3列= 11の行を持つ部分行列を抽出します。

      one two three four
 [1,]   1   6    11   16
 [3,]   3   8    11   18
 [4,]   4   9    11   19

ループせずにこれを実行したいです。私はRに慣れていないので、これはおそらく非常に明白ですが、文書は多少簡潔です。

121
peter2108

As.data.frame()を使用して行列をデータフレームに変換すると、これがより簡単になります。その場合、以前の答え(サブセットまたはm $ 3を使用)は機能しますが、そうでない場合は機能しません。

matrixに対して演算を実行するには、名前で列を定義できます。

m[m[, "three"] == 11,]

または番号で:

m[m[,3] == 11,]

1行しか一致しない場合、結果は行列ではなく整数ベクトルになります。

139
neilfws
m <- matrix(1:20, ncol = 4) 
colnames(m) <- letters[1:4]

次のコマンドは、上の行列の最初の行を選択します。

subset(m, m[,4] == 16)

そしてこれは最後の3つを選択します。

subset(m, m[,4] > 17)

どちらの場合も、結果は行列になります。列の選択に列名を使用したい場合は、次のようにしてそれをデータフレームに変換することをお勧めします。

mf <- data.frame(m)

それから選ぶことができます

mf[ mf$a == 16, ]

または、サブセットコマンドを使用することもできます。

26
John

Dplyrパッケージを使った簡単なアプローチを選びます。

データフレームがデータの場合.

library(dplyr)
result <- filter(data, three == 11)
18
mavez DABAS

サブセットは非常に遅い機能であり、私は個人的には役に立たないと思います。

列名としてMatABを持つCというdata.frame、array、matrixがあるとします。あなたがする必要があるのはそれだけです:

  • 1つの列に1つの条件がある場合、列Aとしましょう

    Mat[which(Mat[,'A'] == 10), ]
    

異なる列に複数の条件がある場合は、ダミー変数を作成できます。条件がA = 10B = 5、およびC > 2であるとすると、次のようになります。

    aux = which(Mat[,'A'] == 10)
    aux = aux[which(Mat[aux,'B'] == 5)]
    aux = aux[which(Mat[aux,'C'] > 2)]
    Mat[aux, ]

system.timeで速度の優位性をテストすることにより、whichメソッドはsubsetメソッドよりも10倍高速です。

10
Mohamad Elmasri

あなたの行列がmと呼ばれているなら、単に使用してください:

R> m[m$three == 11, ]
5
juba

データセットがdataと呼ばれる場合、列 'pm2.5'> 300の値> 300を受け取ることができる条件を満たすすべての行が -

データ[データ['pm2.5']> 300、]

0
Anvita Shukla