【发布时间】:2019-09-01 17:25:11
【问题描述】:
我有一个 data.frame,我想在其中计算嵌套在每年和每个站点中的每个图的年度数据的最小值、平均值和最大值以及周期(具有正值的月数)。我正在尝试使用嵌套循环和聚合函数来执行此操作,但一直遇到错误。
这是我迄今为止尝试过的
DT5 <- NULL
for(i in levels(DT4$Site)) {
for(j in levels(DT4$Year)) {
tmp <- subset(subset(DT4, Site == i), Year== j)
min <- aggregate(tmp[,5], list(tmp$Plot), min)
mean <- aggregate(tmp[,5], list(tmp$Plot), mean)
max <- aggregate(tmp[,5], list(tmp$Plot), max)
per <- sum(tmp[,5] > 0)
tmp <- cbind(rep(i, nrow(mean)), rep(j, nrow(mean)), tmp$Year, mean)
}
if(is.null(DT5)){DT5<-tmp} else {DT5<-rbind(DT5,tmp)}
}
其中 DT4 是包含 Site、Year、Month、Plot 和 WatLev 列的 data.frame
最终,我想实现一个 data.frame,其中包含 Site、Year、Plot、min、mean、max 和 per 为每个地块计算的列,在每个站点中每年。
这是一个示例数据集:
Site <- rep(rep(c("SiteA", "SiteB", "SiteC"), each=144),times=3)
Year <- rep(rep(2001:2003, each=48),times=3)
Month <- rep(rep(rep(c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"), each=4), times=3),3)
Plot <- rep(rep(c("A", "B", "C", "D"), times=36),3)
WatLev <- runif(1296, -50, 5)
DT4 <- cbind(Site, Year, Month, Plot, WatLev)
【问题讨论】:
-
嘿克里斯托弗,看起来你完全可以通过使用
dplyr(例如group_by()和summarise())来避免这种嵌套循环。如果您可以提供您的DT4的一些示例数据,我们可以为您提供一些解决方案。 -
完成!谢谢@Stephan
标签: r dataframe dplyr aggregate nested-loops