Sélectionnez une valeur pour en fonction de la valeur la plus élevée dans une autre colonne

StackOverflow https://stackoverflow.com//questions/10705290

  •  13-12-2019
  •  | 
  •  

Question

Je ne comprends pas pourquoi je ne trouve pas de solution à ce problème, car je pense que c'est une question assez basique.Il faut alors demander de l'aide.Je souhaite réorganiser l'ensemble de données sur la qualité de l'air par mois avec une valeur de température maximale pour chaque mois.De plus je souhaite trouver le jour correspondant pour chaque température maximale mensuelle.Quelle est la manière la plus paresseuse (au niveau du code) de procéder ?

J'ai essayé de suivre sans succès :

require(reshape2)
names(airquality) <- tolower(names(airquality))
mm <- melt(airquality, id.vars = c("month", "day"), meas = c("temp"))

dcast(mm, month + day ~ variable, max)
aggregate(formula = temp ~ month + day, data = airquality, FUN = max)

Je recherche quelque chose comme ceci :

month day temp
5     7    89
...
Était-ce utile?

La solution

Il y a quelque temps, il y a eu toute une discussion sur la question de savoir si être paresseux était une bonne chose ou non.Quoi qu'il en soit, c'est court et naturel à écrire et à lire (et c'est rapide pour les données volumineuses donc vous n'avez pas besoin de le modifier ou de l'optimiser plus tard) :

require(data.table)
DT=as.data.table(airquality)

DT[,.SD[which.max(Temp)],by=Month]

     Month Ozone Solar.R Wind Temp Day
[1,]     5    45     252 14.9   81  29
[2,]     6    NA     259 10.9   93  11
[3,]     7    97     267  6.3   92   8
[4,]     8    76     203  9.7   97  28
[5,]     9    73     183  2.8   93   3

.SD est le sous-ensemble des données pour chaque groupe, et vous voulez juste la ligne avec la plus grande Temp, iiuc.Si vous avez besoin du numéro de ligne, cela peut être ajouté.

Ou pour obtenir toutes les lignes où le maximum est lié :

DT[,.SD[Temp==max(Temp)],by=Month]

     Month Ozone Solar.R Wind Temp Day
[1,]     5    45     252 14.9   81  29
[2,]     6    NA     259 10.9   93  11
[3,]     7    97     267  6.3   92   8
[4,]     7    97     272  5.7   92   9
[5,]     8    76     203  9.7   97  28
[6,]     9    73     183  2.8   93   3
[7,]     9    91     189  4.6   93   4

Autres conseils

Une autre approche avec Plyr

require(reshape2)
names(airquality) <- tolower(names(airquality))
mm <- melt(airquality, id.vars = c("month", "day"), meas = c("temp"), value.name = 'temp')

library(plyr)

ddply(mm, .(month), subset, subset = temp == max(temp), select = -variable)

donne

  month day temp
1     5  29   81
2     6  11   93
3     7   8   92
4     7   9   92
5     8  28   97
6     9   3   93
7     9   4   93

ou, encore plus simple

require(reshape2)
require(plyr)
names(airquality) <- tolower(names(airquality))
ddply(airquality, .(month), subset, 
  subset = temp == max(temp), select = c(month, day, temp) )

que diriez-vous avec plyr?

max.func <- function(df) {
   max.temp <- max(df$temp)

   return(data.frame(day = df$Day[df$Temp==max.temp],
                     temp = max.temp))
}

ddply(airquality, .(Month), max.func)

Comme vous pouvez le constater, la température maximale pour le mois se produit sur plusieurs jours.Si vous souhaitez un comportement différent, la fonction est assez simple à régler.

Ou si vous souhaitez utiliser le data.table package (par exemple, si la vitesse est un problème et que l'ensemble de données est volumineux ou si vous préférez la syntaxe) :

library(data.table)
DT <- data.table(airquality)
DT[, list(maxTemp=max(Temp), dayMaxTemp=.SD[max(Temp)==Temp, Day]), by="Month"]

Si vous voulez savoir ce que .SD signifie, jetez un oeil ici : DONC

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top