【问题标题】:Iteratively summarise within a dplyr pipeline in R在 R 中的 dplyr 管道中迭代总结
【发布时间】:2021-02-22 07:03:00
【问题描述】:

考虑R 中的以下简单dplyr 管道:

df <- data.frame(group = rep(LETTERS[1:3],each=5), value = rnorm(15)) %>% 
  group_by(group) %>% 
  mutate(rank = rank(value, ties.method = 'min'))

df %>%
  group_by(group) %>% 
  summarise(mean_1 = mean(value[rank <= 1]),
            mean_2 = mean(value[rank <= 2]),
            mean_3 = mean(value[rank <= 3]),
            mean_4 = mean(value[rank <= 4]),
            mean_5 = mean(value[rank <= 5]))

如何避免为所有i 输入mean_i = mean(value[rank &lt;= i]) 而不会返回到groupi 的循环?具体来说,有没有一种巧妙的方法来使用dplyr::summarise 函数迭代创建变量?

【问题讨论】:

    标签: r dplyr iteration summarize


    【解决方案1】:

    您实际上是计算累积平均值。 dplyr 中有一个函数cummean,我们可以在这里使用它并将数据转换为宽格式。

    library(tidyverse)
    
    df %>%
      arrange(group, rank) %>%
      group_by(group) %>%
      mutate(value = cummean(value)) %>%
      pivot_wider(names_from = rank, values_from = value, names_prefix = 'mean_')
    
    #  group mean_1 mean_2  mean_3  mean_4  mean_5
    #  <chr>  <dbl>  <dbl>   <dbl>   <dbl>   <dbl>
    #1 A     -0.560 -0.395 -0.240  -0.148   0.194 
    #2 B     -1.27  -0.976 -0.799  -0.484  -0.0443
    #3 C     -0.556 -0.223 -0.0284  0.0789  0.308 
    

    如果您要求通用解决方案并且计算累积平均值只是一个示例,那么您可以使用map

    n <- max(df$rank)
    
    map(seq_len(n), ~df %>%
                      group_by(group) %>%
                      summarise(!!paste0('mean_', .x):= mean(value[rank <= .x]))) %>%
      reduce(inner_join, by = 'group')
    

    数据

    set.seed(123)
    df <- data.frame(group = rep(LETTERS[1:3],each=5), value = rnorm(15)) %>% 
      group_by(group) %>% 
      mutate(rank = rank(value, ties.method = 'min'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      • 2016-12-07
      • 2016-09-25
      相关资源
      最近更新 更多