r - 如何将列名传递给函数 dplyr

标签 r function dplyr

我正在尝试创建一个简单的汇总函数,以加快 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"

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

未知变量:季度类型, 虽然这没有出现在我的原始数据中)

最主要的是我收到一个错误:

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

由于来自 Python,我对如何引用列仍然有点困惑。有人可以解释一下我该如何解决我的错误吗?

最佳答案

我们可以使用 dplyr 开发版本中的新定额(即将在0.6.0发布)

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

enquo具有与 substitute 类似的功能来自base R通过获取输入参数并将其转换为 quosuresone_of接受一个字符串参数,因此可以使用quo_name将quosures转换为字符串。里面group_by/summarise/mutate等等,我们可以通过取消引用来评估 quosure( UQ!! )

<小时/>

quosures似乎与 dplyr 配合得很好尽管我们在执行 tidyr 时遇到一些困难功能。以下代码应该适用于完整代码

 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

关于r - 如何将列名传递给函数 dplyr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43438001/

相关文章:

r - dplyr 的选择助手函数everything() 与复制有何不同?

mysql - MySQL 中的 INNER JOIN 返回同一行的多个条目

r - 已达到 DLL 的最大数量

python - 如何在Python中打印从递增值到递减值的范围

R代码高斯混合——数值表达式有2个元素: only the first used

返回带小数位的值中第一个小于 5 的数字的位置

r - 筛选 Shiny R中的 react 数据集

r - 在R中快速生成数字序列的方法

r - 根据首先加载的表,数据表按钮正在消失

python - 在列表理解中使用多个条件表达式