ddply滞后多个子集

时间:2012-02-29 10:27:35

标签: r plyr lag

我相信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,因为没有任何东西位于腐殖质层的顶部。 举个例子:

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

在数据框中当然应该计算每年和每个深度。我想避免使用哪个和for循环,似乎ddply适合这个,但是我没有运气得到滞后命令来使用ddply。 这是我的代码(显然不是很远):

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

有人有建议吗? 提前谢谢!

1 个答案:

答案 0 :(得分:5)

如果您的数据集中的深度已经是正确的顺序(就像您的例子中那样),您可以这样做:

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

如果它们尚未按深度排序,请将深度设置为具有正确顺序的级别的因子,然后对其进行排序。那么这种方法应该有效。