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
感兴趣,但我愿意接受任何可行的解决方案

例如,如果有人在
第一个上升国家:
列表输入字段中选择了
英国
,则生成的子集应包括:

  • 阿玛·达布拉姆自
    首次登顶以来的国家包括新西兰、美国和英国

  • Amfu Gyabjen,因为第一次上升的国家只包括英国

  • 样本数据

    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, ','))))
    )