【问题标题】:dplyr summarise won't work when I get column name from list?当我从列表中获取列名时,dplyr summarise 不起作用?
【发布时间】:2018-08-15 13:15:47
【问题描述】:

我正在创建一个闪亮的应用程序并使用用户输入来创建图表。当我专门命名管道中的列时,管道和图形可以工作:

f <- fb_ad %>%
  filter(geo == d_choices[2]) %>% 
  group_by(ad_name) %>% 
  summarise(n = sum(clicks))

但是当我使用包含列名/用户输入的列表然后通过管道访问列表的元素时它不起作用:

ycol <- c("impressions","reach", "clicks",
             "age", "gender")

f <- fb_ad %>%
   filter(geo == d_choices[2]) %>% 
   group_by(ad_name) %>% 
   summarise(n = sum(ycol[3]))

我得到错误:

Error in summarise_impl(.data, dots) : 
   Evaluation error: invalid 'type' (character) of argument.

为什么这不起作用,我该如何解决这个问题?谢谢!

【问题讨论】:

    标签: r shiny dplyr


    【解决方案1】:

    如果你有最新版本的 dplyr,以及安装的 rlang 包,你可以使用:

    f <- fb_ad %>%
    filter(geo == d_choices[2]) %>% 
    group_by(ad_name) %>% 
    summarise(n = sum(!!rlang::sym(ycol[3])))
    

    这个原则的一个小型工作示例(对于没有您的数据的其他人)是:

    library(tidyverse)
    ddf <- 
      data.frame(X = rnorm(5), Y = rnorm(5), A = c("A", "A", "B", "B", "B")) %>% 
      tbl_df() %>% mutate(A = as.character(A))
    
    Ch <- c("X", "Y")
    
    ddf %>% group_by(A) %>% 
    summarise(N := sum(!!rlang::sym(Ch[2])))
    

    【讨论】:

    • 该!! (又名 bang-bang)符号很有用。您可以通过搜索“dplyr bang bang”找到有关它的信息(因为大多数搜索引擎不会处理搜索!!)。
    【解决方案2】:

    这是summarise_at() 有用的地方,因为_at 变体直接支持字符串。

    任何要汇总的变量都可以直接作为字符串传递,汇总函数可以按名称传递。如果要重命名输出列,可以将函数放入funs()

    您的示例代码如下所示:

    fb_ad %>%
         filter(geo == d_choices[2]) %>% 
         group_by(ad_name) %>% 
         summarise_at(ycol[3], funs(n = sum) )
    

    【讨论】:

      猜你喜欢
      • 2018-07-12
      • 2019-02-09
      • 2020-12-17
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 2021-05-20
      • 2020-04-23
      相关资源
      最近更新 更多