172

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

6 に答える 6

183

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

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

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

または番号で:

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

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

于 2011-03-22T13:04:37.210 に答える
33

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

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

library(dplyr)
result <- filter(data, three == 11)
于 2015-06-10T19:20:30.070 に答える
32
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 コマンドを使用することもできます。

于 2011-03-22T13:40:08.037 に答える
12

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

列名として、、Matで呼び出されるdata.frame、array、matrixがあると仮定します。その後、あなたがする必要があるのは:ABC

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

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

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

于 2011-08-31T16:23:55.740 に答える
7

マトリックスが と呼ばれる場合はm、次を使用します。

R> m[m$three == 11, ]
于 2011-03-22T12:26:12.327 に答える
0

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

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

于 2019-06-01T18:35:33.703 に答える