行列を持つ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に慣れていないので、これはおそらく非常に明白ですが、文書は多少簡潔です。
As.data.frame()を使用して行列をデータフレームに変換すると、これがより簡単になります。その場合、以前の答え(サブセットまたはm $ 3を使用)は機能しますが、そうでない場合は機能しません。
matrixに対して演算を実行するには、名前で列を定義できます。
m[m[, "three"] == 11,]
または番号で:
m[m[,3] == 11,]
1行しか一致しない場合、結果は行列ではなく整数ベクトルになります。
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, ]
または、サブセットコマンドを使用することもできます。
Dplyrパッケージを使った簡単なアプローチを選びます。
データフレームがデータの場合.
library(dplyr)
result <- filter(data, three == 11)
サブセットは非常に遅い機能であり、私は個人的には役に立たないと思います。
列名としてMat
、A
、B
を持つC
というdata.frame、array、matrixがあるとします。あなたがする必要があるのはそれだけです:
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
メソッドはsubset
メソッドよりも10倍高速です。
あなたの行列がm
と呼ばれているなら、単に使用してください:
R> m[m$three == 11, ]
データセットがdataと呼ばれる場合、列 'pm2.5'> 300の値> 300を受け取ることができる条件を満たすすべての行が -
データ[データ['pm2.5']> 300、]