8

これは、 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
 [6,]   1   6    15   20
 [7,]   5   7    12   20

matrix$two == 7すべての行を返したいのですがmatrix$three == 12、可能な限り高速です。これは私が知っている方法です:

 out <- mat[mat$two == 7,]
 final_out <- out[out$three == 12, ]

final_out明らかに、次のようなワンライナーで 内容を取得する方法があるはずです。final_out <- which(mat$two == 7 && mat$three == 12)これは、上記の 2 行のコードよりも高速で簡潔です。

この複数条件マトリックス クエリを返す最速の R コードは何ですか?

4

5 に答える 5

12

[論理比較でサブセット化を使用するだけです...

#  Reproducible data
set.seed(1)
m <- matrix( sample(12,28,repl=T) , 7 , 4 )
     [,1] [,2] [,3] [,4]
[1,]    4    8   10    3
[2,]    5    8    6    8
[3,]    7    1    9    2
[4,]   11    3   12    4
[5,]    3    3    5    5
[6,]   11    9   10    1
[7,]   12    5   12    5


#  Subset according to condition
m[ m[,2] == 3 & m[,3] == 12 , ]
[1] 11  3 12  4
于 2013-08-08T14:27:49.273 に答える
-2

R での絶対的な最速の方法は、ベクトル化された条件を許可する方法ifelseとは異なります。if条件のベクトル (例: isSeven <- mat[, 'two'] == 7) をキャッシュして、後でそれらを使用/再利用することもできます。

ここには再現可能な例はありませんが、次のようなことをします

ifelse(mat[, 'two'] == 7 & mat[, 'three'] == 12, "both", "not both")

そこに他の条件を配置するか、適合するベクトルになるものを返すようにすることができます。

于 2013-08-08T14:28:33.810 に答える