通过传递列参数创建dplyr函数

时间:2019-07-19 15:47:06

标签: r function dplyr col

我试图将列名作为参数传递给使用dplyr函数的函数。

关于这个主题,已经有多个问题了,我尝试了所有问题,似乎一切都引发了一些错误。

我和quo一起使用过!如here所示。尝试使用! as_label可解决我从上一步使用this获得的错误。还尝试使用group_by_而不是here所述的group_by。我也尝试过使用卷曲运算符进行解析

userMaster <- structure(list(user_id = c(1, 2, 3, 4, 5), city = structure(c(5L, 
5L, 8L, 9L, 10L), .Label = c("Austin", "Boise", "Boston", "Chicago", 
"Dallas", "Denver", "Detroit", "Kansas City", "Las Vegas", "Los Angeles", 
"Manhattan", "Miami", "Minneapolis", "New York City", "Oklahoma City", 
"Omaha", "Phoenix", "Saint Louis", "San Francisco", "Washington DC"
), class = "factor"), source = structure(c(2L, 2L, 2L, 2L, 2L
), .Label = c("Adwords", "Organic", "Search Ads"), class = "factor")), row.names = c(NA, 
5L), class = "data.frame")

userCount <- function(table, metric){
  col_enquo <- enquo(metric)

  summary <- table %>% select(!! (col_enquo), source, user_id) %>%
    group_by_(!! (col_enquo), source) %>% summarise(users = n_distinct(user_id)) %>% 
    left_join(table %>% group_by(source) %>% 
                summarise(total = n_distinct(user_id))) %>% mutate(users/total)
  return(summary)
}

genderDemo <- userCount(userMaster, city)

我遇到各种错误-

Error: `quos(desire)` must evaluate to column positions or names, not a list

Error in !as_label(col_enquo) : invalid argument type 

Error: Quosures can only be unquoted within a quasiquotation context.

  # Bad:
  list(!!myquosure)

  # Good:
  dplyr::mutate(data, !!myquosure)

1 个答案:

答案 0 :(得分:3)

通过print(self.shipListID.ListID) ,我们可以使用rlang_0.4.0(curly-curly运算符)来简化评估

{{...}}

使用OP的数据

library(rlang) #v 0.4.0
library(dplyr) #v 0.8.3
userCount <- function(tbl, metric){

  tbl %>% 
       select({{metric}}, source, user_id) %>%
       group_by({{metric}}, source) %>% 
       summarise(users = n_distinct(user_id)) %>% 
       left_join(tbl %>% 
                group_by(source) %>% 
                summarise(total = n_distinct(user_id))) %>% 
                 mutate(users/total)

   }

genderDemo <- userCount(userMaster, desire)
genderDemo
# A tibble: 12 x 5
# Groups:   desire [4]
#   desire source users total `users/total`
#   <fct>  <fct>  <int> <int>         <dbl>
# 1 A      a          2     4         0.5  
# 2 A      b          1     3         0.333
# 3 A      c          2     5         0.4  
# 4 B      a          1     4         0.25 
# 5 B      b          1     3         0.333
# 6 B      c          1     5         0.2  
# 7 C      a          1     4         0.25 
# 8 C      b          2     3         0.667
# 9 C      c          1     5         0.2  
#10 D      a          1     4         0.25 
#11 D      b          1     3         0.333
#12 D      c          2     5         0.4  

注意:不赞成使用userCount(userMaster2, city) #Joining, by = "source" # A tibble: 4 x 5 # Groups: city [4] # city source users total `users/total` # <fct> <fct> <int> <int> <dbl> #1 Dallas Organic 2 5 0.4 #2 Kansas City Organic 1 5 0.2 #3 Las Vegas Organic 1 5 0.2 #4 Los Angeles Organic 1 5 0.2 后缀方法。因此,请在-{{..}}

中使用group_by

数据

group_by(!! enquo(col_enquo))