R 筛选具有多个值的单元格的列上的数据表
我希望R 筛选具有多个值的单元格的列上的数据表,r,dplyr,shiny,R,Dplyr,Shiny,我希望selectInput字段包含提供了多个First\u ascend\u Country的行。在单个单元格中具有多个国家/地区名称的行用逗号分隔。我对使用dplyr感兴趣,但我愿意接受任何可行的解决方案 例如,如果有人在第一个上升国家:列表输入字段中选择了英国,则生成的子集应包括: 阿玛·达布拉姆自首次登顶以来的国家包括新西兰、美国和英国 Amfu Gyabjen,因为第一次上升的国家只包括英国 样本数据: peaks_stackoverflow <- structure(lis
selectInput
字段包含提供了多个First\u ascend\u Country
的行。在单个单元格中具有多个国家/地区名称的行用逗号分隔。我对使用dplyr
感兴趣,但我愿意接受任何可行的解决方案
例如,如果有人在第一个上升国家:
列表输入字段中选择了英国
,则生成的子集应包括:
首次登顶以来的国家包括新西兰、美国和英国
peaks_stackoverflow <- structure(list(peak_id = c("AMAD", "AMPG", "ANN1", "ANN2", "ANN3",
"ANN4"), peak_name = c("Ama Dablam", "Amphu Gyabjen", "Annapurna I",
"Annapurna II", "Annapurna III", "Annapurna IV"), peak_alternative_name = c("Amai Dablang",
NA, NA, NA, NA, NA), height_metres = c(6814, 5630, 8091, 7937,
7555, 7525), climbing_status = c("Climbed", "Climbed", "Climbed",
"Climbed", "Climbed", "Climbed"), first_ascent_year = c(1961,
1953, 1950, 1960, 1961, 1955), first_ascent_country = c("New Zealand, USA, UK",
"UK", "France", "UK, Nepal", "India", "W Germany"), first_ascent_expedition_id = c("AMAD61101",
"AMPG53101", "ANN150101", "ANN260101", "ANN361101", "ANN455101"
)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"
), spec = structure(list(cols = list(peak_id = structure(list(), class = c("collector_character",
"collector")), peak_name = structure(list(), class = c("collector_character",
"collector")), peak_alternative_name = structure(list(), class = c("collector_character",
"collector")), height_metres = structure(list(), class = c("collector_double",
"collector")), climbing_status = structure(list(), class = c("collector_character",
"collector")), first_ascent_year = structure(list(), class = c("collector_double",
"collector")), first_ascent_country = structure(list(), class = c("collector_character",
"collector")), first_ascent_expedition_id = structure(list(), class = c("collector_character",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), skip = 1), class = "col_spec"))
country_names <- c("New Zealand", "USA", "UK", NA, "France", "Nepal",
"India", "W Germany", "Spain", "Japan", "Slovenia", "Austria",
"Switzerland", "Norway", "Romania", "US", "Canada", "S Korea",
"Netherlands", "Germany", "Poland", "Inida", "Argentina",
"Yugoslavia", "Russia", "Ukraine", "Denmark", "Swiss", "Australia",
"China", "Taiwan", "Singapore", "Italy", "Ireland", "Belgium",
"Brazil", "Netherands", "Georgia", "Portugal")
library(DT)
library(dplyr)
ui <- fluidPage(
titlePanel("Himalayan Climbing Expeditions - Peaks"),
fluidPage(
titlePanel("Basic DataTable"),
fluidRow(
column(4,
selectInput("first" ,
label = "First Ascent Country:",
choices = c("All", country_names),
selected = "All",
multiple = TRUE)))
),
DT::dataTableOutput("table")
)
server <- function(input, output) {
# Filter data based on selections
output$table <- renderDataTable(datatable({
data <- peaks_stackoverflow
if (input$first != "All") {
data <- data[data$first_ascent_country == input$first,]
}
data
}
))
}
shinyApp(ui, server)
peaks\u stackoverflow使用stringr
您可以使用str\u detect
使用您的输入$first
向量为国家识别任何匹配项。使用stru_c
可以将所有input$first
字符串合并到一个字符串搜索模式中
由于您使用的是multiple=TRUE
,因此,如果在添加其他特定国家/地区时包含“All”,则不清楚您可能希望得到什么结果。一种可能性是:如果您检查输入的任何选择是否不是“全部”,您可以进一步细分
library(stringr)
server <- function(input, output) {
# Filter data based on selections
output$table <- renderDataTable(datatable({
req(input$first)
data <- peaks_stackoverflow
if (any(input$first != "All")) {
data <- data %>%
dplyr::filter(str_detect(first_ascent_country,
str_c(input$first, collapse = '|')))
}
data
}))
}
最后,您可以根据您的数据创建一个按字母顺序排列的国家列表(如果可能需要或考虑):
国家/地区名称
data <- subset(data, grepl(paste0(input$first, collapse = '|'), first_ascent_country))
country_names <- sort(
unique(trimws(unlist(strsplit(peaks_stackoverflow$first_ascent_country, ','))))
)