Groupby 1或2个变量,取决于R中的条件

bihw5rsg  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(129)

我想把data分组为group1group1group2,条件是by_group bool。

grouped_DF <- function(data, by_group = TRUE, group1='year',group2='country') {
  data <- data %>%
    group_by(
      if (by_group) c(group1, group2) else group1
    ) %>%
    mutate(...)
    ungroup()
  
  return(data)
}

但是,我不能设法找到一个解决办法。
我得到了第一个与大小不一致相关的错误:if (by_group) c(group1, group2) else组1 must be size 1115451 or 1, not 1115452.
如果我将by_group设置为,则会得到:Caused by error in pick():! Selections can't have missing values.
如果没有条件,如果我简单地用group1分组,函数就可以按预期工作。
有什么建议吗?谢谢

数据示例。

data(mtcars)

grouped_DF <- function(data, by_group = TRUE, group1='carb',group2='gear') {
  data <- data %>%
    group_by(
      if (by_group) c(group1, group2) else group1
    ) %>%
    summarise(
      disp = mean(disp),
      hp = mean(hp)
    )   
  ungroup()
  return(data)
}

mtcars_grouped=grouped_DF(mtcars,by=TRUE)
70gysomp

70gysomp1#

您可以尝试在group_by中使用pick

library(dplyr)

grouped_DF <- function(data, by_group = TRUE, group1='carb',group2='gear') {
  group_col <- if (by_group) c(group1, group2) else group1

  data <- data %>%
    group_by(pick(all_of(group_col))) %>%
    summarise(
      disp = mean(disp),
      hp = mean(hp)
    )  %>% 
  ungroup()
  
  return(data)
}

grouped_DF(mtcars, by_group = TRUE)

# A tibble: 11 × 4
#    carb  gear  disp    hp
#   <dbl> <dbl> <dbl> <dbl>
# 1     1     3 201.  104  
# 2     1     4  84.2  72.5
# 3     2     3 346.  162. 
# 4     2     4 121.   79.5
# 5     2     5 108.  102  
# 6     3     3 276.  180  
# 7     4     3 416.  228  
# 8     4     4 164.  116. 
# 9     4     5 351   264  
#10     6     5 145   175  
#11     8     5 301   335

相关问题