我相信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 = ????)
有人有建议吗? 提前谢谢!
答案 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
如果它们尚未按深度排序,请将深度设置为具有正确顺序的级别的因子,然后对其进行排序。那么这种方法应该有效。