使用聚合函数的嵌套循环中的错误

时间:2019-04-11 06:51:37

标签: r dataframe dplyr aggregate nested-loops

我有一个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是data.frame,其列为Site,Year,Month,Plot和WatLev

最终,我想实现一个data.frame,其中包含“站点”,“年”,“图”,“最小值”,“均值”,“最大值”和“列”,该列是每年每个站点中每个图的计算结果。

以下是示例数据集:

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)

1 个答案:

答案 0 :(得分:1)

好的,尝试一下:

library(dplyr)
DT4 %>% as_tibble() %>%
  mutate(WatLev = as.numeric(WatLev)) %>% 
  group_by(Site, Year) %>% 
  summarise(min = min(WatLev, na.rm = TRUE),
            mean = mean(WatLev, na.rm = TRUE),
            max = max(WatLev, na.rm = TRUE),
            per = sum(WatLev > 0))

输出为:

# A tibble: 9 x 6
# Groups:   Site [3]
  Site  Year    min  mean   max   per
  <chr> <chr> <dbl> <dbl> <dbl> <int>
1 SiteA 2001  -49.8 -24.3  4.76    11
2 SiteA 2002  -50.0 -23.6  4.98     9
3 SiteA 2003  -49.2 -20.7  4.76    16
4 SiteB 2001  -49.3 -21.4  4.85    11
5 SiteB 2002  -49.7 -19.0  4.72    19
6 SiteB 2003  -50.0 -22.0  4.89    17
7 SiteC 2001  -49.2 -20.4  4.97    14
8 SiteC 2002  -49.6 -22.2  4.28    13
9 SiteC 2003  -49.0 -23.3  4.85    14
相关问题