web-dev-qa-db-ja.com

すべての列の最大値と最小値を見つけてから、すべての行の最大値と最小値を見つけます

私はこのマトリックスを持っています:

a <- matrix(rnorm(1000 * 18, mean = 100, sd = sqrt(10)), 1000, 18)

すべての列の最大値と最小値、およびすべての行の最大値と最小値を見つけたいです。

26
Kostas Dimakis

理解した。

すべての列の最小値と最大値:

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

42
Kostas Dimakis

あなたが試すことができます

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
3
Jimbou

matrixStatsパッケージを参照してください。 colMins()rowMaxs()、およびこのような関数を列と行の両方に使用できます。

この回答を参照してください: Rのデータフレーム内の列の最高値を見つける方法

3
eddy85br

最初に行列をリストに変換する必要がありますが(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
1
sindri_baldur