【问题标题】:Add a row to each dataframe in a list with the column median using map_dfr使用 map_dfr 向列表中的每个数据框添加一行,列中位数
【发布时间】:2021-11-08 07:28:29
【问题描述】:

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

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

我想在每个数据帧的末尾添加一个新的行,显示列中位数

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

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

我想了解为什么我的代码无法正常工作,以及 !!! 究竟是为了解决这种情况。

【问题讨论】:

    标签: r list dataframe purrr tibble


    【解决方案1】:

    [, 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  
    

    【讨论】:

    • 好的主人。一如既往的不可思议。非常感谢。现在,如果我想将这些最后一行(例如中位数)加到一个数据框中的最后一行。你能帮帮我吗?而!!! 究竟在这里做了什么。
    • @TarJae 根据?"!!! - The big-bang operator !!! forces-splice a list of objects. The elements of the list are spliced in place, meaning that they each become one single argument.
    • @TarJae 当您说要对最后几行求和时,您是否只想返回 median 行然后只求和?那么,你可能不需要add_row
    • 是的。 add_row 只是出于兴趣,看看发生了什么。
    • @TarJae 请检查更新是否对您有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多