dplyr总结分组作为列名

4

我有一个包含许多列的数据框,希望能够使用多种函数对它们进行汇总。

test_df <- data.frame(Group = sample(c("A", "B", "C"), 10, T), var1 = sample(1:5, 10, T), var2 = sample(3:7, 10, T))

test_df %>% 
  group_by(Group) %>% 
  summarise_all(c(Mean = mean, Sum = sum))

    # A tibble: 3 x 5
  Group var1_Mean var2_Mean var1_Sum var2_Sum
  <chr>     <dbl>     <dbl>    <int>    <int>
1 A          3.14      5.14       22       36
2 B          4.5       4.5         9        9
3 C          4         6           4        6

这将得到一个带有第一行“Group”和列名的tibble,其中列名是先前列名和函数名称的组合。

期望的结果是一个表格,第一行为以前的列名,列名包括组和函数。

我可以通过以下方法实现

test_longer <- test_df %>% pivot_longer(cols = starts_with("var"), names_to = "var", values_to = "val")

# Add row number because spread needs unique identifiers for rows
test_longer <- test_longer %>% 
  group_by(Group) %>% 
  mutate(grouped_id = row_number())

spread(test_longer, Group, val) %>% 
  select(-grouped_id) %>% 
  group_by(var) %>% 
  summarise_all(c(Mean = mean, Sum = sum), na.rm = T)

    # A tibble: 2 x 7
  var   A_Mean B_Mean C_Mean A_Sum B_Sum C_Sum
  <chr>  <dbl>  <dbl>  <dbl> <int> <int> <int>
1 var1    3.14    4.5      4    22     9     4
2 var2    5.14    4.5      6    36     9     6

但这似乎是一个相当漫长的绕路...可能有更好的方法,但我找不到。有什么建议吗?谢谢

1个回答

3

有许多方式可以实现,但我建议先将数据框转换为更长的形式,然后按照vargroup进行分组。接下来,可以直接将数据框转换为更宽的形式,得到最终想要的结果。请注意,我使用了summarize(across())来替换已弃用的summarize_all(),即使只有一列,也可以手动指定Mean = ...Sum = ...

set.seed(123)

test_df %>%
  pivot_longer(
    var1:var2,
    names_to = "var"
  ) %>%
  group_by(Group, var) %>%
  summarize(
    across(
      everything(),
      list(Mean = mean, Sum = sum),
      .names = "{.fn}"
    ),
    .groups = "drop"
  ) %>%
  pivot_wider(
    names_from = "Group",
    values_from = c(Mean, Sum),
    names_glue = "{Group}_{.value}"
  )
#> # A tibble: 2 × 7
#>   var   A_Mean B_Mean C_Mean A_Sum B_Sum C_Sum
#>   <chr>  <dbl>  <dbl>  <dbl> <int> <int> <int>
#> 1 var1       1    2.5    3.2     1    10    16
#> 2 var2       5    4.5    4.4     5    18    22

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接