r - 带有可选分组参数的用户函数,否则在 R 中使用管道

标签 r

我最近开始编写自己的函数,以在使用 R 分析数据时加速标准和重复性任务。
目前我正在研究一个带有三个参数的函数,但遇到了一个我还无法解决的挑战。我想要一个可选的分组参数。在此过程中,该函数应检查是否存在分组参数,然后继续使用子函数 1 或 2。
但如果分组参数不是 NA,我总是收到错误“找不到对象”。我怎样才能做到这一点?
编辑:在我的情况下,过滤器通常用于过滤某些有效或无效的年份。如果存在分组参数,则管道中将遵循比没有分组参数更多的步骤。

require(tidyverse)

Data <- mpg

userfunction <- function(DF,Filter,Group) {
  
  without_group <- function(DF) {
    DF %>% 
      count(year)
  }
  
  with_group <- function(DF) {
    DF %>% 
      group_by({{Group}}) %>% 
      count(year) %>% 
      pivot_wider(names_from=year, values_from=n) %>%
      ungroup() %>% 
      mutate(across(.cols=2:ncol(.),.fns=~replace_na(.x, 0))) %>% 
      mutate(Mittelwert=round(rowMeans(.[,2:ncol(.)],na.rm=TRUE),2))
  }
  
  Obj <- DF %>% 
    ungroup() %>% 
    {if(Filter!=FALSE) filter(.,eval(rlang::parse_expr(Filter))) else filter(.,.$year==.$year)} %>%
    {if(is.na(Group)) without_group(.) else with_group(.)} 
  
  return(Obj)
    
}
对于 NA 它已经有效:
> Data %>% 
+   userfunction(FALSE,NA)
# A tibble: 2 x 2
   year     n
  <int> <int>
1  1999   117
2  2008   117
有参数它不起作用:
> Data %>% 
+   userfunction(FALSE,manufacturer)
 Error in DF %>% ungroup() %>% { : object 'manufacturer' not found
编辑:
我对上述函数的期望是以下输出:
> Data %>% userfunction_exp(FALSE,manufacturer)
# A tibble: 15 x 4
   manufacturer `1999` `2008` Mittelwert
   <chr>         <dbl>  <dbl>      <dbl>
 1 audi              9      9        9  
 2 chevrolet         7     12        9.5
 3 dodge            16     21       18.5
 4 ford             15     10       12.5
 5 honda             5      4        4.5
 6 hyundai           6      8        7  
 7 jeep              2      6        4  
 8 land rover        2      2        2  
 9 lincoln           2      1        1.5
10 mercury           2      2        2  
11 nissan            6      7        6.5
12 pontiac           3      2        2.5
13 subaru            6      8        7  
14 toyota           20     14       17  
15 volkswagen       16     11       13.5

 Data %>% userfunction_exp("cyl==4",manufacturer)
# A tibble: 9 x 4
  manufacturer `1999` `2008`  mean
  <chr>         <dbl>  <dbl> <dbl>
1 audi              4      4   4  
2 chevrolet         1      1   1  
3 dodge             1      0   0.5
4 honda             5      4   4.5
5 hyundai           4      4   4  
6 nissan            2      2   2  
7 subaru            6      8   7  
8 toyota           11      7   9  
9 volkswagen       11      6   8.5
2021-04-01 14:55:编辑以添加一些信息并为函数 with_group 的管道添加一些步骤。

最佳答案

嗨,这是个好问题!
正如前面的答案所指出的,有多种方法可以实现这一点。在 tidyverse 中执行此操作的一种方法是 tidy evaluation
省略您的过滤器功能(您可以更详细地解释...)

 my_summary <- function(df, grouping_var) {
  grp_var <- enquo(grouping_var) #capture group variable
  df %>% my_group_by(grp_var)
}


my_group_by <- function(df, grouping_var){
  # Check if group is supplied 
  if(rlang::quo_is_missing(grouping_var)) {
    df %>% without_group()
  } else {
    df %>% with_group(grouping_var)
  }
  
}


without_group <- function(df) {
  # do whatever without group
  df %>% 
    count(year)
}

with_group <- function(df, grouping_var) {
  # do whatever with group
  df %>% 
    group_by(!!grouping_var) %>% #Note the !!
    count(year) %>% 
    pivot_wider(names_from=year, values_from=n)
}
这会给你没有任何争论
> mpg %>% my_summary()
# A tibble: 2 x 2
   year     n
  <int> <int>
1  1999   117
2  2008   117
随着组传递给管道
> mpg %>% my_summary(model)
# A tibble: 38 x 3
# Groups:   model [38]
   model              `1999` `2008`
   <chr>               <int>  <int>
 1 4runner 4wd             4      2
 2 a4                      4      3
 3 a4 quattro              4      4
 4 a6 quattro              1      2
 5 altima                  2      4
 6 c1500 suburban 2wd      1      4
 7 camry                   4      3
 8 camry solara            4      3
 9 caravan 2wd             6      5
10 civic                   5      4
# ... with 28 more rows

关于r - 带有可选分组参数的用户函数,否则在 R 中使用管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66903767/

相关文章:

css - 如何获取小部件的 CSS 属性?

r - 有很多类别的 ifelse 语句

r - R中的格式化表/矩阵

r - Latex和R之间的工作流程

r - 将颜色分配给一系列值

r - 根据 R 数据框中的变量填充 N 个滞后

r - 使用 dplyr 在 R 中使用 group_by 生成唯一/随机序列号

r - 使用字符串作为函数的参数

r - File.exists() 不起作用

根据时间戳顺序删除重复项