使用 map_dfr 向列表中的每个数据框添加一行,列中位数为

Add a row to each dataframe in a list with the column median using map_dfr

我有这个包含 3 个数据帧的示例列表:

library(tidyverse)
list_df <- iris %>% 
    group_by(Species) %>% 
    slice(1:3) %>% 
    ungroup() %>% 
    group_split(Species)

我想在每个显示列中位数[=的数据框末尾添加一个新的 27=]

到目前为止我的尝试(今天早些时候我确信它成功了)没有成功:

list_df %>%
    map_dfr([,1:4], ~ .x %>%
                add_row(!!!map(., median)))

我想了解 为什么我的代码不起作用以及 !!! 在这种情况下究竟是什么。

[, 1:4] 不包含数据,即它只显示索引,因此失败

list_df %>% 
        map_dfr(~ .x %>% 
             add_row(!!! map(.[1:4], median)))

-输出

# A tibble: 12 x 5
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species   
          <dbl>       <dbl>        <dbl>       <dbl> <fct>     
 1          5.1         3.5          1.4         0.2 setosa    
 2          4.9         3            1.4         0.2 setosa    
 3          4.7         3.2          1.3         0.2 setosa    
 4          4.9         3.2          1.4         0.2 <NA>      
 5          7           3.2          4.7         1.4 versicolor
 6          6.4         3.2          4.5         1.5 versicolor
 7          6.9         3.1          4.9         1.5 versicolor
 8          6.9         3.2          4.7         1.5 <NA>      
 9          6.3         3.3          6           2.5 virginica 
10          5.8         2.7          5.1         1.9 virginica 
11          7.1         3            5.9         2.1 virginica 
12          6.3         3            5.9         2.1 <NA>      

如果我们想在组信息中添加一行,另一种选择是group_modify(不拆分)

iris %>% 
    group_by(Species) %>% 
    slice(1:3) %>%
    group_modify(~ .x %>% 
                add_row(!!! map(.x, median))) %>% 
    ungroup

-输出

# A tibble: 12 x 5
   Species    Sepal.Length Sepal.Width Petal.Length Petal.Width
   <fct>             <dbl>       <dbl>        <dbl>       <dbl>
 1 setosa              5.1         3.5          1.4         0.2
 2 setosa              4.9         3            1.4         0.2
 3 setosa              4.7         3.2          1.3         0.2
 4 setosa              4.9         3.2          1.4         0.2
 5 versicolor          7           3.2          4.7         1.4
 6 versicolor          6.4         3.2          4.5         1.5
 7 versicolor          6.9         3.1          4.9         1.5
 8 versicolor          6.9         3.2          4.7         1.5
 9 virginica           6.3         3.3          6           2.5
10 virginica           5.8         2.7          5.1         1.9
11 virginica           7.1         3            5.9         2.1
12 virginica           6.3         3            5.9         2.1

如果我们要添加 median 行,

iris %>% 
    group_by(Species) %>% 
    slice(1:3) %>%
    group_modify(~ .x %>% 
                add_row(!!! map(.x, median))) %>%
    mutate(rn = row_number()) %>%
    ungroup %>% 
    summarise(across(2:5, ~ c(.[rn < max(rn)], 
      sum(.[rn == max(rn)]))), Species = c(Species[rn != max(rn)],
        "Total"))

-输出

# A tibble: 10 x 5
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
          <dbl>       <dbl>        <dbl>       <dbl> <chr>  
 1          5.1         3.5          1.4         0.2 1      
 2          4.9         3            1.4         0.2 1      
 3          4.7         3.2          1.3         0.2 1      
 4          7           3.2          4.7         1.4 2      
 5          6.4         3.2          4.5         1.5 2      
 6          6.9         3.1          4.9         1.5 2      
 7          6.3         3.3          6           2.5 3      
 8          5.8         2.7          5.1         1.9 3      
 9          7.1         3            5.9         2.1 3      
10         18.1         9.4         12           3.8 Total