Ddply Lag con varios subconjuntos
Pregunta
Creo que Ddply es la herramienta que necesito para mi tarea y estoy teniendo un poco de dificultad para obtener los resultados correctos. He leído por una serie de horas sobre Ddply y he experimentado con diferentes códigos, pero no he llegado más lejos por mi cuenta. Aquí hay un marco de datos de ejemplo
station <- c(rep("muc",13), rep("nbw", 17))
year <- c(rep(1994,4),rep(1995,4),rep(1996,5),rep(1994,5), rep(1995,4), rep(1996,4), rep(1997, 4))
depth <- c(rep(c("HUM","31-60","61-90","91-220"),2), rep(c("HUM","0-30", "31-60","61-90","91-220"),2),rep(c("HUM","0-30", "31-60","91-220"),1),rep(c("HUM","0-30", "31-60","61-90"),2))
doc <- c(80, 10, 3, 2,70, 15, 5, 5,70, 20, 5, 5, 2, 40, 10, 3, 2, 1,50, 15, 5, 2, 45, 20, 2, 1,35, 8, 2, 1)
df <-data.frame(station,year,depth,doc)
df
La profundidad se refiere a la profundidad del suelo (humus de humus) y DOC es el carbono orgánico disuelto medido (DOC) para la profundidad del suelo. Tenga en cuenta que no todos los años tiene mediciones para el DOC y faltan algunas clases de profundidad. Esto es molesto, pero aparece a menudo en mi conjunto de datos. Con Ddply, me gustaría agregar una columna a este cuadro de datos que de modo que para cada profundidad, se devuelve el DOC de la capa de suelo de mentira anterior y para que se proporcione HUM NA, ya que nada está en la parte superior de la capa de humus. Como ejemplo:
depth doc doc_m1
HUM 80 NA
31-60 10 80
61-90 3 10
91-220 2 3
En el proceso de datos, esto, por supuesto, debe calcularse por cada año y cada profundidad. Me gustaría evitar cuál y para los bucles y parece que el DDPLY es adecuado para esto, sin embargo, no tuve ninguna suerte para obtener un comando de retraso para trabajar con Ddply. Esto es tan lejos como conseguí con el código (obviamente no muy lejos):
doc <- ddply(df, .(year), transform,
doc_m1 = ????)
¿Alguien tiene alguna sugerencia? ¡Gracias de antemano!
Solución
Si sus profundidades ya están en el orden correcto en su conjunto de datos (ya que están en su ejemplo), podría hacerlo:
doc2 <- ddply(df, .(station, year), transform,
doc_m1 = c(NA, doc[-length(doc)]))
Nota También agrupé en la estación.Esto da:
> head(doc2, 10)
station year depth doc doc_m1
1 muc 1994 HUM 80 NA
2 muc 1994 31-60 10 80
3 muc 1994 61-90 3 10
4 muc 1994 91-220 2 3
5 muc 1995 HUM 70 NA
6 muc 1995 31-60 15 70
7 muc 1995 61-90 5 15
8 muc 1995 91-220 5 5
9 muc 1996 HUM 70 NA
10 muc 1996 0-30 20 70
Si aún no están clasificados por la profundidad, hacen de la profundidad un factor con los niveles en el orden correcto y luego ordenarlo con respecto a eso.Entonces este enfoque debería funcionar.