1

我在 R 工作,我有以下数据:

data2<- data.frame(region_name = c("West", "West", "East"),  
                   type = c("small", "big", "big"), 
                   beta_rate = 7:9,
                   gamma_rate = 4:6)

我对其执行分组集以汇总总数:

data_i_want <- data2 %>%
              as.data.table() %>% groupingsets(
                                  j = .(
                                         beta_total = sum(beta_rate),
                                         gamma_total = sum(gamma_rate)),
                                  by = c("region_name","type"),
                                  sets = list(
                                    c("region_name"),
                                    c("region_name","type"))
)

输出:

区域名称 类型 beta_total gamma_total
西方 不适用 15 9
东方 不适用 9 6
西方 小的 7 4
西方 大的 8 5
东方 大的 9 6

我的问题:可以将分组集添加到自定义函数中吗?例如,这是我到目前为止所拥有的:

my_function <- function(data, var1, var2) { 
  
  data_final <- data %>%
                as.data.table() %>% groupingsets(
                  j = .(
                    beta_total = sum({{var1}}),
                    gamma_total = sum({{var2}})),
                                  by = c("region_name","type"),
                                  sets = list(
                                    c("region_name"),
                                    c("region_name","type"))
                )
}

但是,当我运行该功能时:

data_i_want <- my_function(data2, beta_rate, gamma_rate)

我收到此错误:

(x, 0L, eval(jj), by)中的错误[.data.table:找不到对象 'var1'

有人能帮忙吗?

4

1 回答 1

1

groupingsets是从data.table。因此,它可能不适用于卷曲运算符 ( {{}})。一个选项是创建一个表达式,然后evalutate`

 my_function <- function(data, var1, var2) { 
     
     var1 <- deparse(substitute(var1))
     var2 <- deparse(substitute(var2))
     
    eval(parse(text = glue::glue("data %>%
                   as.data.table()  %>%
                   groupingsets(
                                            j = .(
                                              beta_total = sum({var1}),
                                              gamma_total = sum({var2})),
                                                            by = c('region_name','type'),
                                                            sets = list(
                                                              c('region_name'),
                                                              c('region_name','type'))
                                          )")))
                   
    
   }

-测试

my_function(data2, beta_rate, gamma_rate)
   region_name   type beta_total gamma_total
        <char> <char>      <int>       <int>
1:        West   <NA>         15           9
2:        East   <NA>          9           6
3:        West  small          7           4
4:        West    big          8           5
5:        East    big          9           6
于 2022-02-24T17:20:43.533 回答