簡體   English   中英

如何在 R 中使用帶有空參數的 group_by()?

[英]How to use group_by() with an empty argument, in R?

我正在編寫一個函數,根據某些分組(g1 和 g2)計算變量的平均值。 我希望該函數能夠處理用戶只想計算組間平均值的情況,因此 group 參數將為空。 我想要一個使用 tidyverse 的解決方案。

假設如下:

y = 1:4
g1 = c('a', 'a', 'b', 'b')
g2 = c(1,2,1,2)
MyData = data.frame(g1, g2, y)

MyFun = function(group){
  group_sym = syms(group)
  MyData %>% 
    group_by(!!!group_sym) %>% 
    summarise(mean = mean(y))
}

# this works well
MyFun(group = c('g1', 'g2'))

現在假設我想要所有組中 y 的平均值。 我希望該功能能夠處理類似

MyFun(group = '')

或者

MyFun(group = NULL)

所以理想情況下,我希望 group 參數為空/空,因此 MyData 不會被分組。 一種解決方案可能是在函數的開頭添加一個條件,檢查參數是否為空以及是否為 TRUE 寫匯總而不使用 group_by。 但這並不優雅,我的真實代碼比幾行要長得多。

任何的想法?

1)使用{{...}}並使用g1代替'g1'

MyFun = function(group) {
  MyData %>% 
    group_by({{group}}) %>% 
    summarise(mean = mean(y)) %>%
    ungroup
}

MyFun(g1)
## # A tibble: 2 x 2
##   g1     mean
##   <fct> <dbl>
## 1 a       1.5
## 2 b       3.5

MyFun()
## # A tibble: 1 x 1
##    mean
##   <dbl>
## 1   2.5

2)這種方法在問題中使用'g1'

MyFun = function(group) {
  group <- if (missing(group)) 'All' else sym(group)
  MyData %>% 
    group_by(!!group) %>% 
    summarise(mean = mean(y)) %>%
    ungroup
}

MyFun('g1')
## # A tibble: 2 x 2
##   g1     mean
##   <fct> <dbl>
## 1 a       1.5
## 2 b       3.5

MyFun()
##  # A tibble: 1 x 2
##   `"All"`  mean
##   <chr>   <dbl>
## 1 All       2.5

3)這也有效並提供與(2)相同的輸出。

MyFun = function(...) {
  group <- if (...length()) syms(...) else 'All'
  MyData %>% 
    group_by(!!!group) %>% 
    summarise(mean = mean(y)) %>%
    ungroup
}
MyFun('g1')
MyFun()

一種不同的方法包括在數據中創建一個假組(名為“across_group”),以防組丟失。

MyFun = function(group) {
  if (missing(group)) MyData$across_group = 1
  group <- if (missing(group)) syms('across_group') else syms(group)

  MyData %>% 
    group_by(!!!group) %>% 
    summarise(mean = mean(y)) %>%
    ungroup
}

MyFun()

# A tibble: 1 x 2
  across_group  mean
         <dbl> <dbl>
1            1   2.5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM