首页 > 解决方案 > 使用动态过滤器在 R Shiny 中聚合数据

问题描述

我有这种格式的数据:

Category Subcategory   User   Count1    Count2
  A           a        New     3000      2000
  A           a        Old      300       200
  A           b        New     4000      3000
  A           b        Old      400       300
  B           c        New     4000      3000
  B           c        Old      600       400

我以这种方式为类别、子类别和用户编写了 3 个过滤器和一个输出数据表:

    selectInput('cat', 'Category', choices = c('All', category)),
    selectInput('sub', 'Subcategory', choices = c('All', subcategory)),
    selectInput('user', 'User', c('All', 'New', 'Old')),
    DT::dataTableOutput('table')

categorysubcategory在选择参数中是列表。我可以通过用户输入以这种方式过滤数据:

output$table <- DT::renderDataTable({
    if(input$cat == 'All'){data <- data}
    else{data <- data[data$Category == input$cat, ]}
    if(input$user == 'All'){data <- data}
    else{data <- data[data$User== input$user, ]}
    if(input$sub == 'All'){data <- data}
    else{data<- data[data$Subcategory == input$sub, ]}
})

我遇到的问题是,当用户输入“全部”参数时,我需要聚合计数列。例如,如果用户为子类别和用户输入“全部”,为类别输入“A”,则输出数据表应如下所示:

Category Subcategory   User   Count1    Count2
  A           All      All     7700      5500

或者

Category  Count1    Count2
  A        7700      5500

我可以为此编写 if-else 条件,但在实际数据中有 6-8 个过滤器,我想知道是否有任何更简单的方法来聚合数据,而无需为所有聚合组合编写 if-else 控件(例如在New所有类别和子类别上的用户聚合所有类别、子类别和用户等)。

标签: rshinydplyraggregate

解决方案


你可以在里面尝试这样的事情DT::renderDataTable

output$table <- DT::renderDataTable({
idx <- which(c(input$cat, input$user, input$sub) != "All")
myvars <- colnames(data)[1:3][idx]

data %>%
  {`if`(input$cat ==  "All", . , filter(., Category == input$cat))} %>% 
  {`if`(input$user == "All", . , filter(., User == input$user))} %>%
  {`if`(input$sub ==  "All", . , filter(., Subcategory == input$sub))} %>%
  {`if`(length(myvars) == 0, ., group_by_at(., myvars) %>% 
          summarise_at(vars(matches("^Count")), sum))}
})

简短说明:

summarisedplyr相当于aggregate。_ summarise_at是 的特例summarise:在第一个参数中,您描述了要聚合(或汇总)的所有变量。我说matches("^Count")这意味着"Count"应该总结所有以开头的变量。第二个参数是聚合函数sum


推荐阅读