私はこのマトリックスを持っています:
a <- matrix(rnorm(1000 * 18, mean = 100, sd = sqrt(10)), 1000, 18)
すべての列の最大値と最小値、およびすべての行の最大値と最小値を見つけたいです。
理解した。
すべての列の最小値と最大値:
apply(a,2,min)
apply(a,2,max)
すべての行の最小および最大:
apply(a,1,min)
apply(a,1,max)
ここで情報を見つけました http://www.personality-project.org/r/r.commands.html
あなたが試すことができます
apply(a, 1, range)
これをt
と組み合わせて使用すると、2つの列が得られます。最初の行が最小で、2番目が行の最大です。
head(t(apply(a, 1, range)))
[,1] [,2]
[1,] 95.75922 103.6956
[2,] 93.62636 106.3934
[3,] 92.70567 106.9190
[4,] 96.53577 104.4971
[5,] 96.61573 107.6691
[6,] 95.56239 105.5887
matrixStats
パッケージを参照してください。 colMins()
、rowMaxs()
、およびこのような関数を列と行の両方に使用できます。
この回答を参照してください: Rのデータフレーム内の列の最高値を見つける方法
最初に行列をリストに変換する必要がありますが(data.frameはリストの特殊なケースです)、行の最大/最小のより高速な代替手段はpmax()
およびpmin()
を使用することです。
apply(a,1,min)
apply(a,1,max)
# becomes
do.call(pmin, as.data.frame(a))
do.call(pmax, as.data.frame(a))
列については、最初に転置する必要があるため、「競争力が低下」します。
apply(a,2,min)
apply(a,2,max)
# becomes
do.call(pmin, as.data.frame(t(a)))
do.call(pmin, as.data.frame(t(a)))
ベンチマーク:
a <- matrix(rnorm(1000 * 18 *10, mean = 100, sd = sqrt(10)), 1000 * 10, 18 * 10)
microbenchmark::microbenchmark(
do.call(pmin, as.data.frame(a)),
apply(a,1,min),
unit = "relative"
)
expr min lq mean median uq max neval
do.call(pmin, as.data.frame(a)) 1.000000 1.0000 1.000000 1.000000 1.000000 1.0000000 100
apply(a, 1, min) 2.281095 2.3576 2.096402 2.531092 2.618693 0.6284233 100