我想將資料幀串列組合/減少到一個資料幀中,但我也想一步匯總資料。輸出來自模擬;因此,每個資料幀都具有相同的輸出結構(即,一個 Group 列,然后是 2 個帶值的列,每個輸出的值都會有所不同)。
最小可重現示例
df_list <- list(structure(list(Group = c("A", "B", "C"), Top_Group = c(1L,
0L, 0L), Efficiency = c(0.464688158128411, 0.652386676520109,
0.282913417555392)), row.names = c(NA, -3L), class = c("tbl_df",
"tbl", "data.frame")), structure(list(Group = c("A", "B", "C"
), Top_Group = c(0L, 1L, 0L), Efficiency = c(0.120292583014816,
0.0356206290889531, 0.37196880299598)), row.names = c(NA, -3L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
Group = c("A", "B", "C"), Top_Group = c(0L, 1L, 0L), Efficiency = c(0.261322160949931,
0.383351784432307, 0.754808459430933)), row.names = c(NA,
-3L), class = c("tbl_df", "tbl", "data.frame")))
我試過的
我知道我可以將資料系結在一起,然后進行分組和總結。
library(tidyverse)
df_list %>%
bind_rows() %>%
group_by(Group) %>%
summarise(Top_Group = sum(Top_Group), Efficiency = max(Efficiency))
# Group Top_Group Efficiency
# <chr> <int> <dbl>
#1 A 1 0.465
#2 B 2 0.652
#3 C 0 0.755
我希望有某種方式可以使用類似的東西reduce;但是,我只能讓它用于拉出一列(如此Top_Group處所示),并且不確定如何在所有列中使用(如果可能)并回傳資料框而不是向量。
df_list %>%
map(2) %>%
reduce(` `)
# [1] 1 2 0
預期產出
Group Top_Group Efficiency
<chr> <int> <dbl>
1 A 1 0.465
2 B 2 0.652
3 C 0 0.755
uj5u.com熱心網友回復:
根據 OP 的代碼,在不同的列上使用了不同的函式。因此,我們可能必須單獨應用這些元素函式
library(purrr)
reduce(df_list, ~ tibble(.x[1], .x[2] .y[2], pmax(.x[3], .y[3])))
-輸出
# A tibble: 3 × 3
Group Top_Group Efficiency
<chr> <int> <dbl>
1 A 1 0.465
2 B 2 0.652
3 C 0 0.755
uj5u.com熱心網友回復:
在基礎 R 中,您可以這樣做
reduce(df_list, function(a, b) cbind(a[1], a[2] b[2], pmax(a[3], b[3])))
#> Group Top_Group Efficiency
#> 1 A 1 0.4646882
#> 2 B 2 0.6523867
#> 3 C 0 0.7548085
uj5u.com熱心網友回復:
另一個解決方案是reduce, fulljoin, 然后是rowwise summarize:
library(tidyverse)
df_list %>%
reduce(full_join, by = "Group") %>%
rowwise() %>%
summarize(Group = Group,
Top_Group = sum(c_across(starts_with("Top_Group"))),
Efficiency = max(c_across(starts_with("Efficiency")))) %>%
ungroup()
# A tibble: 3 x 3
Group Top_Group Efficiency
<chr> <int> <dbl>
1 A 1 0.465
2 B 2 0.652
3 C 0 0.755
uj5u.com熱心網友回復:
使用aggregate 的基本 R 選項ave
aggregate(
. ~ Group,
transform(
do.call(
rbind,
df_list
),
Efficiency = ave(
Efficiency,
Group,
FUN = function(x) max(x) / length(x)
)
), sum
)
給
Group Top_Group Efficiency
1 A 1 0.4646882
2 B 2 0.6523867
3 C 0 0.7548085
uj5u.com熱心網友回復:
你幾乎擁有它!查看?unnest()
require(tidyverse)
df_list %>%
tibble() %>%
unnest(cols = c(.)) %>%
group_by(Group) %>%
summarise(Top_Group = sum(Top_Group), Efficiency = max(Efficiency))
# A tibble: 3 x 3
Group Top_Group Efficiency
<chr> <int> <dbl>
1 A 1 0.465
2 B 2 0.652
3 C 0 0.755
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/467212.html
