Задержка ddply с несколькими подмножествами - PullRequest
4 голосов
/ 29 февраля 2012

Я полагаю, что ddply - это инструмент, который мне нужен для моей задачи, и мне трудно получить правильный результат. Я читал в течение нескольких часов о ddply и экспериментировал с различными кодами, но сам по себе я не стал дальше. вот пример фрейма данных

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

Глубина относится к глубине почвы (HUM = гумусовый слой), а doc представляет собой измеренный растворенный органический углерод (doc) для глубины почвы. Обратите внимание, что не каждый год есть измерения для документа, и некоторые классы глубины отсутствуют. Это раздражает, но часто встречается в моем наборе данных. С помощью ddply я хотел бы добавить столбец к этому фрейму данных, чтобы для каждой глубины возвращался документ вышеупомянутого лежащего слоя почвы, и для HUM NA должен быть задан, так как ничего не находится поверх слоя Humus. как пример:

depth   doc  doc_m1
HUM     80   NA
31-60   10   80
61-90   3    10
91-220  2    3

В кадре данных Это, конечно, следует рассчитывать для каждого года и каждой глубины. Я бы хотел избежать циклов и для циклов, и кажется, что ddply подходит для этого, однако мне не повезло получить команду задержки для работы с ddply. это насколько я получил с кодом (очевидно, не очень далеко):

doc <- ddply(df, .(year), transform,
      doc_m1 = ????)

У кого-нибудь есть предложения? Заранее спасибо!

1 Ответ

5 голосов
/ 01 марта 2012

Если ваши глубины уже находятся в правильном порядке в вашем наборе данных (как в вашем примере), вы можете просто сделать:

doc2 <- ddply(df, .(station, year), transform,
      doc_m1 = c(NA, doc[-length(doc)]))

Примечание. Я также сгруппирован по станции.Это дает:

> 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

Если они еще не отсортированы по глубине, задайте коэффициент глубины с уровнями в правильном порядке, а затем выполните сортировку в соответствии с этим.Тогда этот подход должен работать.

...