web-dev-qa-db-fra.com

Recherchez les valeurs maximale et minimale de chaque colonne, puis les valeurs maximale et minimale de chaque ligne

J'ai cette matrice:

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

Je voudrais trouver la valeur maximale et minimale de chaque colonne et la valeur maximale et minimale de chaque ligne.

26
Kostas Dimakis

Deviner.

Minimum et maximum de chaque colonne:

apply(a,2,min)
apply(a,2,max)

Minimum et maximum de chaque ligne:

apply(a,1,min)
apply(a,1,max)

J'ai trouvé l'information ici http://www.personality-project.org/r/r.commands.html

40
Kostas Dimakis

Tu peux essayer 

apply(a, 1, range)

En utilisant ceci avec t, cela vous donne deux colonnes. Le premier avec le minimum le second avec le maximum des lignes. 

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

Voir le package matrixStats. Vous pouvez utiliser colMins(), rowMaxs() et des fonctions similaires pour les colonnes et les lignes.

Voir cette réponse: Comment trouver la valeur la plus élevée d’une colonne dans un bloc de données dans R?

2
eddy85br

Une alternative plus rapide pour la ligne max/min serait d'utiliser pmax() et pmin() même si vous devez d'abord convertir la matrice en une liste (data.frame est un cas particulier de liste):

apply(a,1,min)
apply(a,1,max)
# becomes
do.call(pmin, as.data.frame(a))
do.call(pmax, as.data.frame(a))

Pour les colonnes, ce sera moins "compétitif" à cause de la transposition préalable:

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)))

Analyse comparative :

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