nouvelle variable = max (de plusieurs variables)

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

Jean-Baptiste MORISSET
Messages : 40
Enregistré le : 20 Mai 2009, 12:46

nouvelle variable = max (de plusieurs variables)

Messagepar Jean-Baptiste MORISSET » 21 Avr 2015, 07:43

Bonjour,
je bloque sur un petit truc surement très simple..... mais je bug.

j'ai une data.frame de 47 variables et 5800 observations, et notamment trois variables de circonférences de tronc C2015 C2015bis et C2015 ter (extrait ci-dessous)

plant ID H12 H2015 C2015 C2015bis C2015ter CB
937 21_PA200cc_937 148 334 209 NA NA NA
938 21_PA200cc_938 176 405 260 NA NA NA
939 21_PA200cc_939 273 480 361 NA NA L
940 21_PA200cc_940 212 457 252 NA NA NA
941 21_PA200cc_941 263 486 308 NA NA NA
942 21_PA200cc_942 219 443 237 NA NA F
943 21_PA200cc_943 189 420 202 NA NA NA
944 21_PA200cc_944 224 451 240 NA NA NA
945 21_PA200cc_945 174 371 130 199 NA NA
946 21_PA200cc_946 166 345 204 NA NA NA
947 21_PA200cc_947 133 326 170 NA NA M
948 21_PA200cc_948 191 393 184 220 NA NA

je cherche à créer une nouvelles variable C15 qui m'indiquerait le max des trois variables précédentes. Je précise qu'il y a pas mal de NA.

Code : Tout sélectionner

data$C15<-as.numeric(max(c(data$C2015,data$C2015bis,data$C2015ter),na.rm = TRUE))

mais ça ne fonctionne pas ça.....

merci d'avance de votre aide

PS: dur dur de se remettre dans R après quelques mois ^^

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

Messagepar Eric Casellas » 21 Avr 2015, 07:53

Bonjour,

Je pense que tu peut remplacer la fonction max par pmax dans ton exemple.
Eric

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 21 Avr 2015, 07:53

Bonjour,

Code : Tout sélectionner

apply(TonData[,5:7],1,max,na.rm=T)

tu ajoute ce résultat comme une colonne de ton tableau

nicolas

Jean-Baptiste MORISSET
Messages : 40
Enregistré le : 20 Mai 2009, 12:46

Messagepar Jean-Baptiste MORISSET » 22 Avr 2015, 09:00

Super!

merci Nicolas, cela fonctionne à la perfection.

en ajoutant un petit

Code : Tout sélectionner

data[(data$C15 == -Inf) & !is.na(data$C15), ] <- NA


histoire de virer les "-Inf" et me voila avec ma nouvelle colonne prêt à l'emploi

Merci encore

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Messagepar Serge Rapenne » 22 Avr 2015, 09:46

Bonjour,

Tu peux éviter le -Inf dans le apply comme ça

Code : Tout sélectionner

apply(TonData[,5:7],1,function(x) ifelse(all(is.na(x)),NA,max(x,na.rm=T)))


Serge

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

Messagepar Logez Maxime » 22 Avr 2015, 10:06

Bonjour,

une autre solution possible dans passer par du apply :

Code : Tout sélectionner

res <- do.call(pmax, c(tab[5:7],na.rm=T))

Si ton tableau est grand ça devrait être plus efficace que le apply.

Code : Tout sélectionner

# avec un tableau de 5800 lignes :
microbenchmark({res <- apply(tab2,1,function(x) max(x, na.rm=T))
res[is.infinite(res)] <- NA},{
res <- do.call(pmax, c(tab2[5:7], na.rm=TRUE))
})
Unit: microseconds
                                                                                         expr
 {     res <- apply(tab2, 1, function(x) max(x, na.rm = T))     res[is.infinite(res)] <- NA }
                                     {     res <- do.call(pmax, c(tab2[5:7], na.rm = TRUE)) }
       min        lq       mean     median         uq       max neval
 25408.227 27010.876 29709.1930 27721.1590 28734.7890 57885.826   100
   190.828   209.455   259.9479   267.2355   283.3905  1379.891   100

Cordialement,
Maxime

Jean-Baptiste MORISSET
Messages : 40
Enregistré le : 20 Mai 2009, 12:46

Messagepar Jean-Baptiste MORISSET » 29 Avr 2015, 06:51

Merci,
ça marche également.... et c'est plus "propre".

A bientôt pour de nouvelles aventures.

JBM


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité