2012-01-06 8 views
5

lo siento, por el título críptico no encontré ningún mejor resumen para mi problema. Así que aquí está mi problema: Tengo una trama de datos y quiere hacer diff() sobre grupos que funciona bien:ddply: cómo incluir un vector de caracteres en el resultado

df <- data.frame (name = rep(c("a", "b", "c"), 4), 
       index = rep(c("c1", "c2"), each=6), 
       year = rep(c(2008:2010),4), 
       value = rep(1:3, each=4)) 

head(df) 

    name index year value 

1 a c1 2008  1 
2 b c1 2009  1 
3 c c1 2010  1 

ddply(df, .(name, year), summarize, value=diff(value)) 

Sin embargo, me gustaría incluir el index en mi resultado wich he intentado que ver con:

ddply(df, .(name, year), summarize, value=diff(value), index=index) 

sin embargo, esto produce el mensaje de error:

length(rows) == 1 is not TRUE 

Cuál es supongo que porque el índice tiene más filas, ya que no es procesada por diff. ¿Hay una solución rápida a mi problema?

¡Muchas gracias!

EDITAR

trato de aclarar mi pregunta lo que quiero añadir al resultado:

Supongamos que la variable index anteriormente. Este es un factor que debería explicar algo. Sin embargo, no puedo tomar diff() que no tenga sentido, así que solo quiero pasar este sin cambiar nada. Intenté drop==FALSE que produjo el mismo mensaje de error.

Sorr por toda esta confusión! Aquí hay un ejemplo muy sencillo:

name year index value 
a 2008 c1 10 
a 2009 c2 30 
a 2010 c1 40 

después de tomar de diff cruzando grupo 'A' será similar a:

name year index d.value 
a 2009 c2  +20 #c2 stayed the same just the first row got intentionally dropped. 
a 2010 c1  +10 

consideran el desafortunado nombre index como algo parecido a un atributo: se puede cambiar durante los años, pero no tendría sentido tomar un diff()

Realmente espero que esto le dé una pista de lo que quiero - si no, eliminaré la pregunta porque encontré una solución poco elegante;) ¡y disculpe las molestias!

+0

¿Cómo quieres alinearlos? Head devuelve los primeros seis elementos por defecto. – hadley

+0

Supongo que no entendí el significado de la parte 'head()' que copié de otra respuesta. básicamente quiero aprobar un índice estrictamente relacionado con el nombre y el año, pero con una frecuencia más alta. ¡aclararé mi pregunta! – Seb

+0

Y cómo quieres que se vea el índice. Un subconjunto en ddply tiene 4 filas, el diff tiene tres valores y los dos primeros tienen el índice c1 y los dos tienen el índice c2. ¿Qué valor de índice pertenecería a eso? "c1-c2"? –

Respuesta

2

No estoy del todo seguro de lo que quiere, sonaba como si quisiera obtener diffs, mantener el índice variable y colocar la primera fila de cada agrupación. ¿Esto te da lo que quieres?

doSummary = function(df) { 
    values = diff(df$value) 
    indexes = df$index[2:length(df)] 
    data.frame(d.value=values, index=indexes) 
} 
ddply(df, .(name, year), doSummary) 
+0

tomó algo de tiempo hasta que alguien fue capaz de descifrar mi explicación críptica, pero parece que fue el resultado que estaba tratando de lograr! ¡muchas gracias! – Seb

Cuestiones relacionadas