我正在编写一个函数,要求用户在函数调用中定义一个或多个分组变量.然后使用dplyr对数据进行分组,如果只有一个分组变量,它会按预期工作,但我还没有想出如何使用多个分组变量.
例:
x <- c("cyl")
y <- c("cyl", "gear")
dots <- list(~cyl, ~gear)
library(dplyr)
library(lazyeval)
mtcars %>% group_by_(x) # groups by cyl
mtcars %>% group_by_(y) # groups only by cyl (not gear)
mtcars %>% group_by_(.dots = dots) # groups by cyl and gear, this is what I want.
Run Code Online (Sandbox Code Playgroud)
我试着变成y和dots使用相同:
mtcars %>% group_by_(.dots = interp(~var, var = list(y)))
#Error: is.call(expr) || is.name(expr) || is.atomic(expr) is not TRUE
Run Code Online (Sandbox Code Playgroud)
如何使用> 1个变量名的用户定义输入字符串(如y示例中所示)使用dplyr对数据进行分组?
(这个问题在某种程度上与这个有关,但在那里没有回答.)
我正在编写一个新的Shiny应用程序,我想通过使用dplyr命令进行数据操作来保持在Hadleyverse中.我希望Shiny打印一个表格,根据用户可以选择的变量仅显示前3个观察结果.例如,一个用户可能希望在收到的奖励数量方面看到前三名员工,而另一个用户希望在获得的奖励积分数量方面看到前三名.
在我最近的尝试中,我有这个为ui.R:
library(shiny)
shinyUI(fluidPage(
verticalLayout(
tableOutput("tbl"),
selectInput("top3", label = h4("Quantity"),
choices = list("Number of awards" = "NumberOfAwards",
"Total points awarded" = "TotalAwarded")),
tableOutput("t3")
)))
Run Code Online (Sandbox Code Playgroud)
这对于server.R:
library(dplyr)
library(shiny)
shinyServer(function(input, output) {
employeestats <- read.table(header=TRUE, text='
Employee NumberOfAwards TotalAwarded
Al 3 10
Betty 6 20
Chuck 2 5
Donna 4 15
Ed 0 0
')
output$tbl <- renderTable({
employeestats
},include.rownames=TRUE)
datasetInput <- reactive({employeestats})
output$t3 <- renderTable({
head(datasetInput() %>% arrange(desc(input$top3)),n=3)
},include.rownames=TRUE)
})
Run Code Online (Sandbox Code Playgroud)
在Shiny之外,命令
head(employeestats %>% arrange(desc(NumberOfAwards)),n=3)
Run Code Online (Sandbox Code Playgroud)
给出前三名获奖者的答案.在Shiny中,完整的表和选择框打印时没有Top 3表,我收到消息"eval中的错误(替换(expr),envir,enclos):不能安排类'NULL'的列".我知道这与使用非标准函数的Shiny和dplyr有关,如果R看到NumberOfAwards或字符串"NumberOfAwards",它可能会有所不同.我尝试过像deparse(substitute())这样的东西,使用数字来表示要排列的列等,但没有成功.这不必详细说明; 例如,我不关心第三名的关系.
有任何想法吗?谢谢您的帮助.