r - 使用动态过滤器在 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')
category
subcategory
在选择参数中是列表。我可以通过用户输入以这种方式过滤数据:
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所有类别和子类别上的用户或聚合所有类别、子类别和用户等)。
解决方案
你可以在里面尝试这样的事情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))}
})
简短说明:
summarise
dplyr
相当于aggregate
。_ summarise_at
是 的特例summarise
:在第一个参数中,您描述了要聚合(或汇总)的所有变量。我说matches("^Count")
这意味着"Count"
应该总结所有以开头的变量。第二个参数是聚合函数sum
。
推荐阅读
- hive - Presto - Hive 连接器的 Ranger 问题
- node.js - Express.js 如何安全地检索请求 IP?
- php - 使用中间表定义一对一关系以避免外键循环的雄辩方式
- javascript - 使用多个 OnEdit
- python - 无法捕获 InvalidFileException
- php - OpenCart 错误未捕获错误:类“Controllerextensiontotalaffiliate”
- java - java spring中的webapplication文件夹名称是否必须是webapp?
- java - 为什么当 Consumer 只接受一个参数时,forEach 方法接受调用具有多个参数的方法的 lambda?
- flutter - 从 Flutter 中的 API 获取数据后如何导航到新屏幕?
- ios - 现在如何在 RealmSwift 4.0 更新中使用枚举?