2011-11-16 12 views
11

Come si seleziona la prima riga di un frame di dati R che soddisfa determinati criteri?Come si seleziona la prima riga in un frame di dati R che soddisfi determinati criteri?

Ecco contesto:

Ho un frame di dati con cinque colonne:

"pixel", "year","propvar", "component", "cumsum." 

Ci sono 1.225 combinazioni di pixel e year, poiché i dati sono stati calcolati dalla serie temporale annuale di 49 pixel geografici per ciascuno dei 25 anni di studio. All'interno di ogni anno-pixel, ho calcolato propvar, la proporzione della varianza totale spiegata da un dato componente della trasformata di Fourier veloce per le serie temporali di un dato anno-pixel. Ho quindi calcolato cumsum, che è la somma cumulativa di propvar per ogni componente di frequenza entro un anno-pixel. La colonna component ti fornisce solo un indice per il componente della serie di Fourier (più 1) dal quale è stato calcolato propvar.

Desidero determinare il numero di componenti necessari per spiegare oltre il 99% della varianza. Immagino che un modo per farlo sia trovare la prima riga all'interno di ogni pixel anno in cui cumsum> 0,99 e creare un frame dati da esso con tre colonne, pixel, year e numbercomps, dove numbercomps è il numero di componenti richiesti all'interno un dato anno-pixel per spiegare oltre il 99% della varianza. Non so come farlo in R. Qualcuno ha una soluzione?

risposta

19

Sicuro. Qualcosa del genere dovrebbe fare il trucco:

# CREATE A REPRODUCIBLE EXAMPLE! 
df <- data.frame(year = c("2001", "2003", "2001", "2003", "2003"), 
       pixel = c("a", "b", "a", "b", "a"), 
       cumsum = c(99, 99, 98, 99, 99), 
       numbercomps=1:5) 
df 
# year pixel cumsum numbercomps 
# 1 2001  a  99   1 
# 2 2003  b  99   2 
# 3 2001  a  98   3 
# 4 2003  b  99   4 
# 5 2003  a  99   5 

# EXTRACT THE SUBSET YOU'D LIKE. 
res <- subset(df, cumsum>=99) 
res <- subset(res, 
       subset = !duplicated(res[c("year", "pixel")]), 
       select = c("pixel", "year", "numbercomps")) 
# pixel year numbercomps 
# 1  a 2001   1 
# 2  b 2003   2 
# 5  a 2003   5 

EDIT Inoltre, per chi è interessato a data.table, c'è questo:

library(data.table) 
dt <- data.table(df, key="pixel, year")  
dt[cumsum>=99, .SD[1], by=key(dt)] 
+3

Holy crap. Ora so perché hai accumulato 2.157 punti in soli 43 giorni di abbonamento a StackOverflow. Grazie uomo! Ho questa risposta nella cartella StackOverflow del mio client di posta elettronica. Ti riconoscerò in qualsiasi pubblicazione risultante da questa assistenza. ADORO la funzione duplicata, BTW. È come ... esattamente quello di cui avevo bisogno. (A proposito, le pubblicazioni sarebbero, ovviamente, il risultato di molto più lavoro di questo particolare problema, LOL.) Buona notte. –

+0

Fresco. Mandami una copia di qualsiasi pubblicazione del progetto (anche se ovviamente non è necessario alcun riconoscimento)! –

+0

Lo farà! E ho controllato la tua risposta. Grazie ancora. –

Problemi correlati