首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用循环的tidyeval函数?

如何使用循环的tidyeval函数?
EN

Stack Overflow用户
提问于 2017-08-25 16:31:27
回答 1查看 756关注 0票数 3

考虑一下这个简单的例子

代码语言:javascript
复制
library(dplyr)

dataframe <- data_frame(id = c(1,2,3,4),
                        group = c('a','b','c','c'),
                        value = c(200,400,120,300))


> dataframe
# A tibble: 4 x 3
     id group value
  <dbl> <chr> <dbl>
1     1     a   200
2     2     b   400
3     3     c   120
4     4     c   300

以及这个tidyeval函数,它使用dplyr根据某些输入列聚合我的数据。

代码语言:javascript
复制
func_tidy <- function(data, mygroup){
  quo_var <- enquo(mygroup)

  df_agg <- data %>% 
    group_by(!!quo_var) %>% 
    summarize(mean = mean(value, na.rm = TRUE),
              count = n()) %>% 
    ungroup()

  df_agg
}

现在,这起作用了

代码语言:javascript
复制
> func_tidy(dataframe, group)
# A tibble: 3 x 3
  group  mean count
  <chr> <dbl> <int>
1     a   200     1
2     b   400     1
3     c   210     2

但是在循环中执行相同的操作会导致失败。

代码语言:javascript
复制
for(col in c(group)){
  func_tidy(dataframe, col)
}
 Error in grouped_df_impl(data, unname(vars), drop) : Column `col` is unknown 

这里有什么问题?如何在循环中使用我的tidyeval函数?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-25 17:40:55

在遍历列名时,需要使用字符串。

for(col in "group")

将此变量传递给函数时,需要使用rlang::sym将其从字符串转换为符号。您可以使用!!取消引用,以便计算表达式。

因此,您的循环应该是这样的(我添加了一个print来查看输出):

代码语言:javascript
复制
for(col in "group"){
    print( func_tidy(dataframe, !! rlang::sym(col) ) )
}

# A tibble: 3 x 3
  group  mean count
  <chr> <dbl> <int>
1     a   200     1
2     b   400     1
3     c   210     2
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45885829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档