2011-11-16 9 views
11

¿Cómo selecciono la primera fila de un marco de datos R que cumple con ciertos criterios?¿Cómo selecciono la primera fila en un marco de datos R que cumple con ciertos criterios?

Aquí es el contexto:

tengo una trama de datos con cinco columnas:

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

Hay 1.225 combinaciones de pixel y year, ya que los datos se calcula a partir de la serie temporal anual de 49 píxeles geográficos para cada uno de los 25 años de estudio. Dentro de cada píxel-año, he calculado propvar, la proporción de la varianza total explicada por un componente dado de la transformada de Fourier rápida para la serie temporal de un píxel-año dado. Luego calculé cumsum, que es la suma acumulada de propvar para cada componente de frecuencia dentro de un píxel-año. La columna component solo le da un índice para el componente de serie de Fourier (más 1) del cual se calculó propvar.

Quiero determinar el número de componentes necesarios para explicar más del 99% de la varianza. Me imagino que una forma de hacerlo es encontrar la primera fila dentro de cada píxel-año donde cumsum> 0.99, y crear un marco de datos con tres columnas, pixel, year y numbercomps, donde numbercomps es el número de componentes requeridos dentro un píxel-año dado para explicar más del 99% de la varianza. No sé cómo hacer esto en R. ¿Alguien tiene una solución?

Respuesta

19

Sure. Algo como esto debe hacer el truco:

# 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 

EDITAR Además, para aquellos interesados ​​en data.table, no es este:

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

Mierda. Ahora sé por qué acumuló 2.157 puntos en solo 43 días de membresía de StackOverflow. ¡Gracias hombre! Tengo esta respuesta en la carpeta StackOverflow de mi cliente de correo electrónico. Le reconoceré en cualquier publicación que resulte de esta asistencia. AMO la función duplicada, por cierto. Es como ... exactamente lo que necesitaba. (Por cierto, las publicaciones serían, por supuesto, el resultado de mucho más trabajo que este problema en particular, jaja.) Que tengas una buena noche. –

+0

Cool. ¡Envíame una copia de cualquier pub del proyecto (aunque no es necesario reconocimiento por supuesto)! –

+0

¡Lo haré! Y he verificado tu respuesta. Gracias de nuevo. –

Cuestiones relacionadas