首页 > 解决方案 > 将数据框 Group BY 代码放入 R 中的函数中

问题描述

我在 R 中有一个代码,我在其中处理多个数据帧。

数据框格式示例:

ClientID     Group   CountC   
  X1           A       3
  R3           B       2
  D4           A       1
  T5           A       7
  H0           B       5 

其他数据框具有相同的 2 列,但CountC有所不同。

对于每个数据框,我都有一个通用代码,它按组 / 计算分位数,然后旋转数据框的形式:

quantileByGroup <- 
  df %>%
    group_by(Group) %>%
      summarize(Q25 = quantile(CountC, probs = .25), 
              Q50 = quantile(CountC, probs = .5),
              Q75 = quantile(CountC, probs = .75),
              Q100 = quantile(CountC, probs = 1))


quantileByGroupFinal <- pivot_longer(quantileByGroup,
                          cols = c(2,3,4,5),
                          names_to = "name",
                          values_to = "value")

为了避免每次都重复相同的代码,我想把这段代码放在一个函数中。

但是,当我尝试时,这很复杂,尤其是这部分:

quantileByGroup <- 
  df %>%
    group_by(Group) %>%
      summarize(Q25 = quantile(CountC, probs = .25), 
              Q50 = quantile(CountC, probs = .5),
              Q75 = quantile(CountC, probs = .75),
              Q100 = quantile(CountC, probs = 1))

因为不可能在函数中传递列名GroupCountC作为参数。

有没有办法做到这一点?

谢谢

标签: r

解决方案


f <- function(.data, .group, .summarize)
{
  .data %>% 
    dplyr::group_by({{.group}}) %>% 
    dplyr::summarise( "{{.summarize}}_Q25" := quantile({{.summarize}}, probs = .25), 
                      "{{.summarize}}_Q50" := quantile({{.summarize}}, probs = .5),
                      "{{.summarize}}_Q75" := quantile({{.summarize}}, probs = .75),
                      "{{.summarize}}_Q100" := quantile({{.summarize}}, probs = 1)) %>% 
    dplyr::ungroup() %>% 
    tidyr::pivot_longer(-{{.group}}) %>% 
    return()
}

并调用:

df %>% 
   f(.group = Group, .summarize = CountC) 

推荐阅读