2014-06-13 26 views
37

Ho il seguente frame di dati che ho chiamato ozono:Come trovare il valore più alto di una colonna in un frame di dati in R?

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 

Vorrei estrarre il massimo valore da ozone, Solar.R, Wind ...

Inoltre, se possibile come sarebbe I sorta Solar.R o una colonna di questo frame di dati al fine

decrescente ho provato

max(ozone, na.rm=T) 

che mi dà il valore più alto nel set di dati.

ho anche provato

max(subset(ozone,Ozone)) 

ma ottenuto "subset" must be logical."

posso impostare un oggetto per contenere il sottoinsieme di ciascuna colonna, con i seguenti comandi

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

ma dà la lo stesso valore di 334, che è il valore massimo del frame di dati, non la colonna.

Qualsiasi aiuto sarebbe fantastico, grazie.

+6

'max (ozono $ ozono)' 'o max (sottoinsieme (ozono, selezionare = ozono))'. Dovresti assolutamente dare un'occhiata al materiale R introduttivo sull'indicizzazione delle colonne per i frame di dati, che è il tuo problema di base. (Questa è una domanda sulla coursera, giusto? Https://github.com/ahawker/data-analysis-coursera/blob/master/HW1/hw1.R) –

+0

@BenBolker Sì, lo è. btw come hai grigio sezioni del tuo commento. –

+2

Ho usato backtick '' (sono sicuro che ci sia aiuto per la formattazione da qualche parte qui?) –

risposta

35

Simile a colMeans, colSums, ecc, si potrebbe scrivere una funzione di colonna massima, colMax, e una funzione di colonna di ordinamento, colSort.

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

Io uso ... nella seconda funzione nella speranza di scintille tuo intrigo.

ottenere i dati:

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") 

Usa colMax funzione sui dati di esempio:

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

di fare la selezione su una singola colonna,

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

e più di tutte le colonne utilizzare la nostra funzione colSort,

colSort(dat, decreasing = TRUE) ## compare with '...' above 
+1

Converte i tuoi valori in numeri, quindi 'lapply' potrebbe essere preferibile. – Frank

5

In risposta a trovare il valore massimo per ogni colonna, si potrebbe provare a utilizzare la funzione 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 
+0

Puoi approfondire cosa sta succedendo qui? –

+2

Ovviamente, inserisci "? Apply" nella tua console per seguirlo. La funzione ha i seguenti argomenti: 'apply (X, MARGIN, FUN, ...)'. 'X' si riferisce al tuo array o, in questo caso, al frame dei dati. 'MARGIN' specifica come si desidera che la funzione venga applicata al frame di dati. Ad esempio, '1' indica le righe mentre' 2' è per le colonne. 'FUN' è la funzione che desideri applicare sopra il MARGIN selezionato. La risposta sopra crea una funzione definita dall'utente che trova il valore massimo mentre ignora i valori di NA. In breve, la risposta individua il valore massimo in ogni colonna del frame dei dati ignorando le NA. – ccapizzano

26

Per ottenere il massimo di una colonna che si desidera qualcosa di simile:

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

Per ottieni il massimo di tutte le colonne che desideri:

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

E per ordinare:

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

o per ordinare l'altra direzione:

ozone[rev(order(ozone$Solar.R)),] 
+1

Per ottenere il massimo di tutte le colonne, può anche essere: 'apply (ozone, 2, max, na.rm = TRUE)'. –

5

Ecco una soluzione 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)) 

UPDATE:summarise_each() è stato deprecato in favore di una famiglia più ricco di funzioni di funzioni: mutate_all(), mutate_at(), mutate_if(), summarise_all(), summarise_at(), summarise_if()

Ecco come si potrebbe fare:

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

o

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

Un altro modo sarebbe quello di utilizzare? 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 
+1

Questo è pulito (+1), ma vale la pena notare che la conversione in "matrice" e, quindi, di nuovo in "data.frame" è lenta e "pmax" perde il suo vantaggio in termini di velocità. ('apply' è più lento su un" data.frame ", per lo stesso motivo). Per esempio. 'DF = as.data.frame (matrice (campione (100, 1e6, T), 1e2, 1e4))'; 'microbenchmark :: microbenchmark (sapply (DF, max), do.call (pmax, as.data.frame (t (DF))), applica (DF, 2, max), unlist (lapply (DF, max)) , as.matrix (DF), as.data.frame (t (DF)), times = 20) '. Post scriptum Scusate, per il lungo (e in parte irrilevante) commento qui, ma mi piace 'pmax' :) –

0

max(ozone$Ozone, na.rm = TRUE) dovrebbe fare il trucco. Ricordarsi di includere lo na.rm = TRUE oppure R restituirà NA.

0
max(may$Ozone, na.rm = TRUE) 

Senza $Ozone che filtrerà in tutto il frame di dati, questo può essere appreso nella biblioteca turbolenza.

Sto studiando questo corso su Coursera troppo ~

1

Supponendo che i dati in data.frame chiamati maxinozone, si può fare questo

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

provare questa soluzione:

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

Ci è un pacchetto matrixStats che fornisce alcune funzioni per fare riepiloghi di colonne e righe, vedere nel pacchetto vignette, ma è necessario Trasforma il tuo data.frame in una matrice.

quindi si esegue: colMaxs(as.matrix(ozone))

Problemi correlati