如何将列名传递到dplyr函数中

6
我正在尝试创建一个简单的总结函数,以加快在R Markdown文件中使用多个数据列的报告速度。
var1是一个分类数据列,t_var是表示该数据季度的整数,dt是完整的数据。
summarise_data_categorical <- function(var1, t_var, dt){

  print(var1)
  print(t_var)

  #Select the columns to aggregate
  group_func <- dt %>% 
    select(one_of(t_var, var1)) %>%
    group_by(t_var,var1)

  #create simple count summary
  count_table <- group_func %>%
    summarise(count = n()) %>%
    spread(t_var, count)

  #create a frequency version of the same table...
  freq <- dt %>%
    select(t_var, var1) %>%
    group_by(t_var,var1) %>%
    summarise(count = n()) %>%
    mutate(freq = round(count / sum(count),3)*100) %>%
    select(-count)

  #Present that table
  freq_table <- freq %>%
    spread(t_var, freq)

  #Create the chart to do the same thing..
  freq_chart <- freq %>%
    ggplot()+
    geom_line(mapping=aes(x=t_var, y = freq, colour=var1))

  #Compile outputs as a list
  results <- list(count_table, freq_table, freq_chart)

  #Return list
  results

}

假设我有一个框架:

fr <- data.frame(lets = sample(LETTERS, 100, replace=TRUE),
           `quarter type` = sample(1:4, 100, replace=TRUE))

如果我这样运行函数:

summarise_data_categorical("lets", "quarter type", fr)

最初的输出很有前景:
[1] "lets"
[1] "quarter type"

(注意:在尝试重新创建数据时,由于某种原因,我也收到了警告:

未知变量:quarter type, 虽然这在我的原始数据中并未出现)

主要问题是我遇到了错误:

Error in resolve_vars(new_groups, tbl_vars(.data)) : unknown variable to group by : t_var

作为一个来自Python的人,我仍然对如何引用列感到有些困惑。有人能解释一下我哪里做错了吗?


请仅展示最小的函数而非完整代码,这样更容易让其他人进行测试。 - akrun
@akrun,感谢您的建议。 - elksie5000
1个回答

7
我们可以使用即将在0.6.0版本发布的开发版本中的新quosures。
summarise_data_categorical <- function(var1, t_var, dt){

  var1 <- enquo(var1)
  t_var <- enquo(t_var)
  v1 <- quo_name(var1)
  v2 <- quo_name(t_var) 

  dt %>%
    select(one_of(v1, v2)) %>%
    group_by(!!t_var, !!var1) %>%
    summarise(count = n()) 

}
summarise_data_categorical(lets, quartertype, fr)
#Source: local data frame [65 x 3]
#Groups: quartertype [?]

#   quartertype   lets count
#         <int> <fctr> <int>
#1            1      A     1
#2            1      F     2
#3            1      G     2
#4            1      H     1
#5            1      I     1
#6            1      J     4
#7            1      M     3
#8            1      N     1
#9            1      P     1
#10           1      S     5
# ... with 55 more rows

enquobase R中的substitute功能类似,它将输入参数转换为quosuresone_of接受一个字符串参数,因此可以使用quo_namequosures转换为字符串。 在group_by/summarise/mutate等函数内部,我们可以通过非引用(UQ!!)来评估quosure


尽管我们在使用tidyr函数时遇到了一些困难,但dplyr似乎可以正常工作。 以下代码应该适用于整个代码

 summarise_data_categorical <- function(var1, t_var, dt){

  var1 <- enquo(var1)
  t_var <- enquo(t_var)

  v1 <- quo_name(var1)
  v2 <- quo_name(t_var) 

  Summ_func <- dt %>%
                    select(one_of(v1, v2)) %>%
                  group_by(!!t_var, !!var1) %>%
                    summarise(count = n())

   count_table <- Summ_func %>%
                  spread_(v2, "count") 

   freq <-  Summ_func %>%
                  mutate(freq = round(count / sum(count),3)*100) %>%
              select(-count)

   freq_table <- freq %>%
                    spread_(v2, "freq")

   freq_chart <- freq %>%
             ggplot()+
               geom_line(mapping=aes_string(x= v2 , y = "freq", colour= v1)) 

   results <- list(count_table, freq_table, freq_chart)
   results

    }
summarise_data_categorical(lets, quartertype, fr)
#[[1]]
# A tibble: 24 × 5
#     lets   `1`   `2`   `3`   `4`
#*  <fctr> <int> <int> <int> <int>
#1       A    NA    NA     1     2
#2       B     2    NA    NA     1
#3       C     1     5     1     2
#4       E     1     1    NA    NA
#5       G    NA     1     2     2
#6       H     1    NA     1     1
#7       I    NA     1     1     2
#8       J     2     1     1     1
#9       K     1     1     2     1
#10      L    NA     2    NA    NA
# ... with 14 more rows

#[[2]]
# A tibble: 24 × 5
#     lets   `1`   `2`   `3`   `4`
#*  <fctr> <dbl> <dbl> <dbl> <dbl>
#1       A    NA    NA   3.1   9.5
#2       B   8.7    NA    NA   4.8
#3       C   4.3  20.8   3.1   9.5
#4       E   4.3   4.2    NA    NA
#5       G    NA   4.2   6.2   9.5
#6       H   4.3    NA   3.1   4.8
#7       I    NA   4.2   3.1   9.5
#8       J   8.7   4.2   3.1   4.8
#9       K   4.3   4.2   6.2   4.8
#10      L    NA   8.3    NA    NA
## ... with 14 more rows

#[[3]]

enter image description here


1
非常感谢您的帮助和解释,以及迅速的回复。谢谢。我已经学习R三个星期了,它仍然让我感到惊叹。 :) - elksie5000
1
太好了。我从未听说过quosures - 这里有一个很好的参考,供其他没有听说过的人使用:http://rstudio-pubs-static.s3.amazonaws.com/260900_eed544dc1f504bffb4521913eb2da86e.html - elksie5000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接