当我从列表中获取列名时,dplyr摘要将无法工作?

时间:2018-08-15 13:15:47

标签: r shiny dplyr

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

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.

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

2 个答案:

答案 0 :(得分:2)

如果您具有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])))

答案 1 :(得分:0)

这是<div class="modal" id="addQuestion" role="dialog"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button class="close" data-dismiss="modal">&times;</button> <h4>DemoTitle</h4> </div> <div class="modal-body"> <p>put a lot of stuff here</p> </div> <div class="modal-footer"> <button class="btn btn-primary" data-dismiss="modal">close</button> </div> </div> </div> 有用的地方,因为<div class="admin-center"> <table id="main-table" class="table table-striped table-bordered"> <thead> <tr> <th class="select-all"> <input type="checkbox" class="hide" id="select-all-checkbox" /> <h3><label style="font-weight:normal;" for="select-all-checkbox">Select</label></h3> </th> <th><h4 class="nobr"><label>Position</label></h4></th> <th><h4 style="text-align:left;" class="nobr"><label>Question</label></h4></th> </tr> </thead> <tbody> @foreach (var question in Model.allQuestions) { <tr> <td><input type="checkbox" name="select" value="@question.position" /></td> <td>@question.position</td> <td style="text-align:left;">@question.question</td> </tr> } </tbody> </table> <br /> <br /> <div class="admin-center"> <button id="btnUp" class="btn btn-lg btn-primary">Move Up</button> <button id="btnDown" class="btn btn-lg btn-primary">Move Down</button> </div> <br /> <div class="admin-center"> <a class="btn btn-lg btn-primary" data-toggle="#addQuestion">Add Questions</a> <a class="btn btn-lg btn-primary">Delete Question</a> </div> 变体直接支持字符串。

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

这是您的示例代码的样子:

_at