Renvoyer les deux premières valeurs maximales d'un vecteur

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

Lisa Marasca
Messages : 9
Enregistré le : 10 Avr 2020, 10:18

Renvoyer les deux premières valeurs maximales d'un vecteur

Messagepar Lisa Marasca » 27 Avr 2020, 15:04

Bonjour,

J'ai des données du type :

Code : Tout sélectionner

couleur <- c("orange","bleu","vert","jaune","bleu","vert","bleu")
code <- c("1","1","1","1","2","2","3")
nombre <-c(33.5,24,508,345,32.6,44,2.1)
data<-data.frame(couleur,code,nombre)


Je souhaite que le script me renvoie les deux lignes correspondantes aux deux premières valeurs maximales par code. Par exemple pour 1 je souhaite obtenir les lignes correspondantes aux valeurs de 508 et 345. Je souhaite réaliser cela sur l'ensemble des cellules de la colonne code. J'ai donc le script suivant :

Code : Tout sélectionner

Max_nombre <- function(data){
  data <- data[data$nombre == head(sort(data$nombre,decreasing = TRUE), 2),]
  return(data)
}

data<- by(data,as.factor(data$code),Max_nombre)

data_VF <- do.call(rbind,data)


Cependant quand je fais cela, j'obtiens le warning suivant : "longer object length is not a multiple of shorter object length" et certaines valeurs disparaissent. Par exemple pour le code "2" je devrais obtenir les deux uniques valeurs mais rien n'apparaît le script me renvoie les valeurs max du code "1" et celle du code "3".
Ma base de donnée est bien plus grande que celle-là et je remarque également un autre problème qui est sûrement lié au reste, dans certains cas au lieu de me renvoyer les deux valeurs max du code "1" le script n'en renvoie qu'une seule.

Est-ce que quelqu'un sait d'où le problème peut venir ?

Merci d'avance et bonne journée !
Lisa

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Re: Renvoyer les deux premières valeurs maximales d'un vecteur

Messagepar Eric Casellas » 27 Avr 2020, 15:38

Salut,

le soucis viens de l'utilisation de == dans ta comparaison, il te faut utiliser %in%.
Et sinon au lieu d'utiliser le même objet data pour toutes tes étapes ca peut etre pratique d'en avoir un différent a chaque fois que ca change de signification et de ne pas utiliser le nom data qui est aussi un nom de fonction, par exemple :

Code : Tout sélectionner

  couleur <- c("orange","bleu","vert","jaune","bleu","vert","bleu")
  code <- c("1","1","1","1","2","2","3")
  nombre <- c(33.5,24,508,345,32.6,44,2.1)
  mydata <- data.frame(couleur,code,nombre, stringsAsFactors = FALSE)
   
  Max_nombre <- function(olddata){
    newdata <- olddata[olddata$nombre %in% head(sort(olddata$nombre,decreasing = TRUE), 2),]
    return(newdata)
  }
 
  data_list <- by(mydata,as.factor(mydata$code),Max_nombre)
 
  data_VF <- do.call(rbind,data_list)


Eric
Eric

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Renvoyer les deux premières valeurs maximales d'un vecteur

Messagepar François Bonnot » 27 Avr 2020, 15:57

Bonjour,
Ou plus simplement :

Code : Tout sélectionner

Max_nombre <- function(df) head(df[order(-df$nombre),],2)
François

Lisa Marasca
Messages : 9
Enregistré le : 10 Avr 2020, 10:18

Re: Renvoyer les deux premières valeurs maximales d'un vecteur

Messagepar Lisa Marasca » 27 Avr 2020, 16:03

Cela fonctionne parfaitement! Merci beaucoup.

Bonne fin de journée,
Lisa.


Retourner vers « Questions en cours »

Qui est en ligne

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