web-dev-qa-db-fra.com

Comment trouver la plus haute valeur d'une colonne dans un bloc de données dans R?

J'ai le cadre de données suivant que j'ai appelé ozone:

   Ozone Solar.R Wind Temp Month Day
1     41     190  7.4   67     5   1
2     36     118  8.0   72     5   2
3     12     149 12.6   74     5   3
4     18     313 11.5   62     5   4
5     NA      NA 14.3   56     5   5
6     28      NA 14.9   66     5   6
7     23     299  8.6   65     5   7
8     19      99 13.8   59     5   8
9      8      19 20.1   61     5   9

Je voudrais extraire la plus haute valeur de ozone, Solar.R, Wind...

Aussi, si possible, comment pourrais-je trier Solar.R ou n'importe quelle colonne de ce cadre de données par ordre décroissant

J'ai essayé

max(ozone, na.rm=T)

ce qui me donne la plus haute valeur de l'ensemble de données.

J'ai aussi essayé

max(subset(ozone,Ozone))

mais j'ai "subset" must be logical."

Je peux définir un objet pour contenir le sous-ensemble de chaque colonne, à l'aide des commandes suivantes

ozone <- subset(ozone, Ozone >0)
max(ozone,na.rm=T) 

mais il donne la même valeur de 334, qui est la valeur maximale du bloc de données, pas la colonne.

Toute aide serait formidable, merci.

55
Alfonso Vergara

Semblable à colMeans, colSums, etc., vous pouvez écrire une fonction de maximum de colonne, colMax, et une fonction de tri de colonne, colSort.

colMax <- function(data) sapply(data, max, na.rm = TRUE)
colSort <- function(data, ...) sapply(data, sort, ...)

J'utilise ... dans la deuxième fonction dans l'espoir de déclencher votre intrigue.

Obtenez vos données:

dat <- read.table(h=T, text = "Ozone Solar.R Wind Temp Month Day
1     41     190  7.4   67     5   1
2     36     118  8.0   72     5   2
3     12     149 12.6   74     5   3
4     18     313 11.5   62     5   4
5     NA      NA 14.3   56     5   5
6     28      NA 14.9   66     5   6
7     23     299  8.6   65     5   7
8     19      99 13.8   59     5   8
9      8      19 20.1   61     5   9")

Utilisez la fonction colMax sur des exemples de données:

colMax(dat)
#  Ozone Solar.R    Wind    Temp   Month     Day 
#   41.0   313.0    20.1    74.0     5.0     9.0

Pour faire le tri sur une seule colonne,

sort(dat$Solar.R, decreasing = TRUE)
# [1] 313 299 190 149 118  99  19

et sur toutes les colonnes, utilisez notre fonction colSort,

colSort(dat, decreasing = TRUE) ## compare with '...' above
51
Rich Scriven

Pour obtenir le maximum de n'importe quelle colonne, vous voulez quelque chose comme:

max(ozone$Ozone, na.rm = TRUE)

Pour obtenir le maximum de toutes les colonnes, vous voulez:

apply(ozone, 2, function(x) max(x, na.rm = TRUE))

Et pour trier:

ozone[order(ozone$Solar.R),]

Ou pour trier l’autre direction:

ozone[rev(order(ozone$Solar.R)),]
34
WheresTheAnyKey

Voici une solution dplyr:

library(dplyr)

# find max for each column
summarise_each(ozone, funs(max(., na.rm=TRUE)))

# sort by Solar.R, descending
arrange(ozone, desc(Solar.R))

PDATE:summarise_each() est devenu obsolète au profit d'une famille de fonctions plus complète: mutate_all(), mutate_at(), mutate_if(), summarise_all() , summarise_at(), summarise_if()

Voici comment vous pourriez faire:

# find max for each column
ozone %>%
         summarise_if(is.numeric, funs(max(., na.rm=TRUE)))%>%
         arrange(Ozone)

ou

ozone %>%
         summarise_at(vars(1:6), funs(max(., na.rm=TRUE)))%>%
         arrange(Ozone)
7
rrs

En réponse à la recherche de la valeur maximale pour chaque colonne, vous pouvez essayer d'utiliser la fonction apply():

> apply(ozone, MARGIN = 2, function(x) max(x, na.rm=TRUE))
  Ozone Solar.R    Wind    Temp   Month     Day 
   41.0   313.0    20.1    74.0     5.0     9.0 
6
ccapizzano

Une autre façon serait d'utiliser? Pmax

do.call('pmax', c(as.data.frame(t(ozone)),na.rm=TRUE))
#[1]  41.0 313.0  20.1  74.0   5.0   9.0
2
akrun

En supposant que vos données dans data.frame appelé maxinozone, vous pouvez le faire

max(maxinozone[1, ], na.rm = TRUE)
1
harindersingh

max(ozone$Ozone, na.rm = TRUE) devrait faire l'affaire. N'oubliez pas d'inclure le na.rm = TRUE ou bien R retournera NA.

0
WallyTaylor

Essayez cette solution:

Oz<-subset(data, data$Month==5,select=Ozone) # select ozone  value in the month of                 
                                             #May (i.e. Month = 5)
summary(T)                                   #gives caracteristics of table( contains 1 column of Ozone) including max, min ...
0
S.ElBahloul
max(may$Ozone, na.rm = TRUE)

Sans $Ozone, il filtrera dans tout le cadre de données, cela peut être appris dans la bibliothèque swirl.

J'étudie aussi ce cours sur Coursera ~

0
markcodd

Il existe un paquetage matrixStats qui fournit des fonctions permettant de faire des résumés de colonnes et de lignes, voir dans le paquetage vignette , mais vous devez convertir votre data.frame en matrice.

Ensuite, vous lancez: colMaxs(as.matrix(ozone))

0
eddy85br