r - Dplyr 多个管道动态变量?

标签 r dplyr tidyeval

我经常这样做:

library(tidyverse)

iris %>% 
  group_by(Species) %>% 
  summarise(num_Species = n_distinct(Species)) %>% 
  mutate(perc_Species = 100 * num_Species / sum(num_Species))

所以我想创建一个输出相同内容但具有动态命名的 num_ 和 perc_ 列的函数:

num_perc <- function(df, group_var, summary_var) {
  
}

我找到了 this resource很有用,但它没有直接解决如何以我想要的方式重用新创建的列名。

最佳答案

您可以在 group_var 上使用 as_label(enquo()) 提取作为字符向量传递的变量以生成新列。您可以在您发送的链接文档中看到一个明显的例子是 6.1.3。这样,我们可以动态地将 num_perc_ 添加到您的摘要变量中,只需要传入 dfgroup_var.

library(dplyr)

num_perc <- function(df, group_var) {
  summary_lbl <- as_label(enquo(group_var))
  num_lbl <- paste0("num_", summary_lbl)
  perc_lbl <- paste0("perc_", summary_lbl)
  
  df %>%
    group_by({{ group_var }}) %>%
    summarize(!!num_lbl := n_distinct({{ group_var }})) %>%
    mutate(!!perc_lbl := 100 * .data[[num_lbl]] / sum(.data[[num_lbl]]))
}

num_perc(iris, Species)
#> # A tibble: 3 × 3
#>   Species    num_Species perc_Species
#>   <fct>            <int>        <dbl>
#> 1 setosa               1         33.3
#> 2 versicolor           1         33.3
#> 3 virginica            1         33.3

在这种情况下,group_varsummary_var 实际上不同,但本质上是相同的解决方案。

num_perc <- function(df, group_var, summary_var) {
  summary_lbl <- as_label(enquo(summary_var))
  num_lbl <- paste0("num_", summary_lbl)
  perc_lbl <- paste0("perc_", summary_lbl)
  
  df %>%
    group_by({{ group_var }}) %>%
    summarize(!!num_lbl := n_distinct({{ summary_var }})) %>%
    mutate(!!perc_lbl := 100 * .data[[num_lbl]] / sum(.data[[num_lbl]]))
}

num_perc(iris, Species, Species)

关于r - Dplyr 多个管道动态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70862897/

相关文章:

r - curly curly 整洁的评估和修改输入或其名称

r - 为什么 !! (bang-bang) 结合 as.name() 给出与 !! 不同的输出。还是 as.name() 单独?

r - 将 Forecast.gts(hts 包)与外部回归器和并行处理结合使用

r - 更改列名的字母大小写

在 R 或聚合中 reshape 数据长数据?

r - 在时间序列的背景下分解

r - 使用 dplyr::filter 的 tidyeval 方法是什么?

r - 在 R 中的行名称中使用向量的值?

在 R 中按月使用栅格堆栈进行栅格线性和条件回归

r - 在 R 中将列表作为长格式的列的 tibble?