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!

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top