Valeur minimum par ligne

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

jeremie jacquemin
Messages : 11
Enregistré le : 07 Jan 2019, 15:40

Valeur minimum par ligne

Messagepar jeremie jacquemin » 08 Jan 2019, 08:21

Bonjour,

Je souhaiterais identifier la colonne (son nom par exemple) associée à la valeur minimum dans chaque ligne dans mon jeu de données.

Exemple :

Code : Tout sélectionner

x <- c(15,50,6,8,7,8,4,51,12,88,6,2,5,40)
y <- c(22,14,71,5,6,85,7,23,3,50,22,1,9,10)
z <- x+10

don <- rbind.data.frame(x,y,z)
colnames(don) <- c("ind1","ind2","ind3","ind4","ind5","ind6","ind7","ind8","ind9","ind10","ind11","ind12","ind13","ind14")

Sur cet exemple, je voudrais ajouter une colonne supplémentaire avec pour chaque ligne, le nom de colonne associé au minimum.
Donc ici la nouvelle colonne comprendrait les valeurs :

Code : Tout sélectionner

ind12 ind9 ind12

J'ai 1 million de lignes donc je voudrais une fonction (vectorielle ?) qui soit très rapide, si vous avez des idées je vous en remercie.

Jérémie

jeremie jacquemin
Messages : 11
Enregistré le : 07 Jan 2019, 15:40

Re: Valeur minimum par ligne

Messagepar jeremie jacquemin » 08 Jan 2019, 08:38

Avec apply ça marche :

Code : Tout sélectionner

apply(don, 1, which.min)

Mais c'est un peu long (4-5 sec. avec 1M lignes), donc si vous connaissez une fonction plus rapide je suis preneur.

Merci,

Jérémie

matthieu faron
Messages : 586
Enregistré le : 16 Fév 2011, 11:23

Re: Valeur minimum par ligne

Messagepar matthieu faron » 08 Jan 2019, 08:41

Une proposition mais sans idée su r le caractère rapide ou non...

Code : Tout sélectionner

don$min <- colnames(don)[apply(don, 1, which.min)]
don
Matthieu FARON

matthieu faron
Messages : 586
Enregistré le : 16 Fév 2011, 11:23

Re: Valeur minimum par ligne

Messagepar matthieu faron » 08 Jan 2019, 08:48

Ah ! Coifé sur le poteau

il y a peut être plus rapide avec les fonctions de dplyr ou data.table... mais est-ce vraiment utile ? 4-5 secondes c'est pas non plus la mort

Ca change quelque chose si on l'applique à une matrice plutôt qu'à un data.frame ?
Matthieu FARON

jeremie jacquemin
Messages : 11
Enregistré le : 07 Jan 2019, 15:40

Re: Valeur minimum par ligne

Messagepar jeremie jacquemin » 08 Jan 2019, 08:58

Oui je vais regarder du côté de dplyr qui peut peut être m'aider pour améliorer la rapidité d'exécution.

J'ai d'autres traitements pour mes données en amont de celui-ci donc j'essaye de réduire au maximum le temps de calcul, d'où mon intérêt pour son optimisation.

Jérémie

jeremie jacquemin
Messages : 11
Enregistré le : 07 Jan 2019, 15:40

Re: Valeur minimum par ligne

Messagepar jeremie jacquemin » 08 Jan 2019, 09:07

Et non le fait d'appliquer ça à une matrice ne facilite pas le traitement

matthieu faron
Messages : 586
Enregistré le : 16 Fév 2011, 11:23

Re: Valeur minimum par ligne

Messagepar matthieu faron » 08 Jan 2019, 09:11

Mais c'est peut être plus facile à transposer ?

La dernière fois que j'avais essayé, travailler avec dplyr sur les lignes c'était un peu galère...c'est plutôt fait pour traiter les colonnes
Plus d'info ici:
https://speakerdeck.com/jennybc/row-oriented-workflows-in-r-with-the-tidyverse?slide=28

J'ai lu beaucoup de commentaires positifs sur la rapidité de data.table mais jamais essayé moi-même et ne sais pas si ça marche sur les lignes plutôt que les colonnes.

Sinon j'ai vu ça :

Code : Tout sélectionner

transpose(don) %>% map(which.min)
Matthieu FARON

jeremie jacquemin
Messages : 11
Enregistré le : 07 Jan 2019, 15:40

Re: Valeur minimum par ligne

Messagepar jeremie jacquemin » 08 Jan 2019, 13:28

Oui effectivement je peux essayer de transposer ma matrice et travailler sur les colonnes avec dplyr, je vais regarder ce qui peut m'intéresser. Je ne connais pas non plus data.table.

Merci quand même,

Jérémie

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Valeur minimum par ligne

Messagepar Logez Maxime » 08 Jan 2019, 13:54

Bonjour,

Ce n'est pas très classe comme code et par forcément idéal et facile à lire mais ça semble aller plus vite. Pour ça il te faut le package rpgm.

Code : Tout sélectionner

library(rpgm)
c((don == rowMins(don))%*%matrix(1:ncol(don), ncol(don)))
Cordialement,
Maxime

jeremie jacquemin
Messages : 11
Enregistré le : 07 Jan 2019, 15:40

Re: Valeur minimum par ligne

Messagepar jeremie jacquemin » 08 Jan 2019, 14:55

Effectivement, le calcul matriciel est beaucoup plus rapide, c'est une solution qui me convient donc je vais utiliser cette méthode.

Merci !

Jérémie

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Valeur minimum par ligne

Messagepar Logez Maxime » 09 Jan 2019, 08:01

Bonjour,

je savais bien qu'on pouvait faire encore plus efficace avec les fonctions du package rpgm :

Code : Tout sélectionner

don <- matrix(rnorm(1e6*14), 1e6)
colnames(don) <- sprintf("X%02d", 1:ncol(don))

library(rpgm)
x1 <- colnames(don)
auxi <- rowMins(don)
test1 <- x1[t(don == auxi)*1:ncol(don)]
Cordialement,
Maxime

jeremie jacquemin
Messages : 11
Enregistré le : 07 Jan 2019, 15:40

Re: Valeur minimum par ligne

Messagepar jeremie jacquemin » 09 Jan 2019, 09:22

Bonjour,

Effectivement, cette solution me paraît bien adaptée à mon problème, merci.

Jérémie


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

cron