转换数据框列表以获得 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个数据帧,如下图:
- 计算每个 IHA 的平均值(不拆分为子流域或年份)
- 计算每个 IHA 的平均值(分成年但不分成子流域)
- 计算每个 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
我正在用 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个数据帧,如下图:
- 计算每个 IHA 的平均值(不拆分为子流域或年份)
- 计算每个 IHA 的平均值(分成年但不分成子流域)
- 计算每个 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