我相信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
Run Code Online (Sandbox Code Playgroud)
深度是指土壤深度(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
Run Code Online (Sandbox Code Playgroud)
在数据框中当然应该计算每年和每个深度.我想避免使用哪个和for循环,似乎ddply适合这个,但是我没有运气得到滞后命令来使用ddply.这是我的代码(显然不是很远):
doc <- ddply(df, .(year), transform,
doc_m1 = ????)
Run Code Online (Sandbox Code Playgroud)
有没有人有建议?提前致谢!
如果您的数据集中的深度已经是正确的顺序(就像在您的示例中那样),您可以这样做:
doc2 <- ddply(df, .(station, year), transform,
doc_m1 = c(NA, doc[-length(doc)]))
Run Code Online (Sandbox Code Playgroud)
注意我也在电台上分组.这给出了:
> 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
Run Code Online (Sandbox Code Playgroud)
如果它们尚未按深度排序,请将深度设置为具有正确顺序的级别的因子,然后对其进行排序.那么这种方法应该有效.