转换数据框列表以获得 df 名称和年度均值的均值

transform list of data frames to obtain means for df names and yearly means

我正在用 R 语言分析河流流量数据,我有一个数据框列表。每个数据框代表一个子流域(910、950、1012 和 1087),具有完全相同的结构和变量数量,并且包含每年 (2004:2007) 的 IHA 指标值(IHA1、IHA2)

Flowtest <- list("910" = tibble(Year = c(2004:2007), IHA1=c(123, 170, 187, 245), IHA2=c(679, 870, 789, 233)),
                 "950" = tibble(Year = c(2004:2007), IHA1=c(570, 450, 780, 650), IHA2=c(230, 470, 687, 321)),
                 "1012" = tibble(Year = c(2004:2007), IHA1=c(160, 170, 670, 780), IHA2=c(350, 840, 701, 353)),
                 "1087" = tibble(Year = c(2004:2007), IHA1=c(120, 780, 820, 580), IHA2=c(870, 870, 763, 291)))

我想得到3个数据帧,如下图:

  1. 计算每个 IHA 的平均值(不拆分为子流域或年份)
  2. 计算每个 IHA 的平均值(分成年但不分成子流域)
  3. 计算每个 IHA 的平均值(拆分为子流域但不拆分为年份)

实际上,我的列表包含更多子流域和 IHA 指标

对于 1. 我设法创建了这个:

    test <- Flowtest %>% 
      reduce(bind_rows) %>% 
      summarise_all(mean) %>%
      select(-Year)

我想创建一个与上述代码类似的代码,以获得如 2. 和 3. 所示的结果(如图所示)。我该怎么做?

嗨,乔安娜,一个可能的解决方案是:

library(plyr)
library(dplyr)

# bind list to a tibble and make list names to a column
Flowtest_df <- plyr::ldply(Flowtest, data.frame) %>% 
  dplyr::rename(RCH = 1)

# mean
Flowtest_df %>% 
  dplyr::summarise(IHA1_mean = mean(IHA1),
                   IHA2_mean = mean(IHA2))
# year mean
Flowtest_df %>% 
  dplyr::group_by(Year) %>% 
  dplyr::summarise(IHA1_mean = mean(IHA1),
                   IHA2_mean = mean(IHA2))
# RCH mean
Flowtest_df %>%  
  dplyr::group_by(RCH) %>% 
  dplyr::summarise(IHA1_mean = mean(IHA1),
                   IHA2_mean = mean(IHA2))

您还可以这样做:

map(list(NULL,'Year','subbasin'), ~bind_rows(Flowtest, .id = "subbasin") %>%
      group_by(.dots = .x)%>%summarise(across(starts_with("IHA"), mean),.groups='drop'))
[[1]]
# A tibble: 1 x 2
   IHA1  IHA2
  <dbl> <dbl>
1  453.  582.

[[2]]
# A tibble: 4 x 3
   Year  IHA1  IHA2
  <int> <dbl> <dbl>
1  2004  243.  532.
2  2005  392.  762.
3  2006  614.  735 
4  2007  564.  300.

[[3]]
# A tibble: 4 x 3
  subbasin  IHA1  IHA2
  <chr>    <dbl> <dbl>
1 1012      445   561 
2 1087      575   698.
3 910       181.  643.
4 950       612.  427