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


144

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を初めて使用するので、これはおそらく非常に明白ですが、ドキュメントはしばしば簡潔です。


4
すべての回答の基本的な考え方は、インデックスと同じ長さの論理ベクトル/行列(TRUEおよびFALSE)がある場合、TRUEのケースのみを選択するということです。[ ]答えの間でコードを実行すると、これがよりはっきりとわかります。
Sacha Epskamp

回答:


160

これは、as.data.frame()を使用してマトリックスをデータフレームに変換すると、より簡単になります。その場合、以前の回答(サブセットまたはm $ threeを使用)は機能しますが、それ以外の場合は機能しません。

マトリックスで操作を実行するには、名前で列を定義できます。

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

または番号で:

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

1行のみが一致する場合、結果は行列ではなく整数ベクトルになることに注意してください。


19
マトリックスを維持する必要がある場合は、次の作業を行ってくださいm[m[,3] == 11,,drop=FALSE]
Joris Meys

@neilfws列の範囲にいくつかの値を定義する場合の解決策は何ですか。たとえばdf <- df[!which(df$ARID3A:df$YY1 == "U"),]、ここでは、列の範囲(ARID3A:YY1)に値Uが含まれているdfからこれらの行を削除します。
2016

列名をまったく指定したくないが、マトリックス内のすべての列を処理したい場合、これはどのように機能しますか?
user5359531 2016

@neilfwsさん、これに&&ステートメントをどのように追加できますか?2つの列の値を同時に取得する必要がありますか?
XDをデバッグする'19年

28
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, ]

または、subsetコマンドを使用することもできます。


21

dplyrパッケージを使用する簡単なアプローチを選択します。

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

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

11

サブセットは非常に遅い関数で、個人的には役に立たないと思います。

私はあなたがdata.frame、配列と呼ばれる行列持っていると仮定MatしてABC列名などを; その後、あなたがする必要があるのは:

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

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

異なる列に複数の条件がある場合は、ダミー変数を作成できます。仮定条件はA = 10B = 5C > 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方法は方法よりも10倍高速になりsubsetます。


6

マトリックスが呼び出される場合はm、次のように使用します。

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

@juba列の範囲にいくつかの値を定義する場合の解決策は何ですか。たとえばdf <- df[!which(df$ARID3A:df$YY1 == "U"),]、ここでは、列の範囲(ARID3A:YY1)に値が含まれているdfからこれらの行を削除しますU
Newbie

0

データセットがデータと呼ばれる場合、列 'pm2.5'> 300の値が満たされるという条件を満たすすべての行は、

data [data ['pm2.5']> 300、]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.