【问题标题】:How to replace values of a columns of CSV in R shiny如何在 R Shiny 中替换 CSV 列的值
【发布时间】:2021-11-28 08:14:05
【问题描述】:

下面的代码是用 R shiny 编写的,目前从“mtcars”数据库中读取数据。此应用程序用于替换列中的特定数据。它具有用于选择列的“要搜索的列”等选项,用于替换用户在“替换”字段中指定的值的“替换”和“按”。它现在运行良好。

但我真正想要的是使用“浏览”来上传我自己的 csv 数据并执行与“替换”和“BY”相同的操作。如何做到这一点?

预期结果:

如何替换值? (从旧值到新值)。例如,我应该如何通过引用下面 csv 数据中“选择列”中的列名来修改“范围”列中的值 100 到 500?

当前 csv:

ID  Type  Category    Range
21  A1     B1          100
22  C1     D1          200
23  E1     F1          300

预期的 CSV 结果:

ID  Type  Category    Range
21  A1     B1          500
22  C1     D1          200
23  E1     F1          300

app.R

library(shiny)
library(DT)
library(dplyr)

ui <- fluidPage(
   sidebarLayout(
      sidebarPanel(
         fileInput("file1", "Choose CSV File", accept = ".csv"),
         selectInput("col", "Column to search:", names(mtcars), names(mtcars)[1]),
         textInput("old", "Replace:"),
         textInput("new", "By:"),
         actionButton("replace", "Replace!"),
      ),
      mainPanel(
         DTOutput("table1")
      )
   )
)

server <- function(input, output, session) {
   my_data <- reactiveVal(mtcars)
   
   observeEvent(input$replace, {
      req(input$col)
      dat <- my_data()
      traf <- if (is.numeric(dat[[input$col]])) as.numeric else identity
      my_data(dat %>%
                 mutate(!!rlang::sym(input$col) := 
                           replace(!!rlang::sym(input$col),
                                   as.character(!!rlang::sym(input$col)) == input$old,
                                   input$new) %>% 
                           traf()))
   })
   
   output$table1 <- renderDT(
      my_data()
   )
}

shinyApp(ui, server)

【问题讨论】:

  • @RonakShah,我已经更新了上面的“预期 CSV 结果”。
  • @RonakShah,我在这里分享的 CSV 只是我更大的 CSV 的一部分,它有超过 100,000 条记录。我想用来替换我从selectInput 中选择的列中的一些值(从显示 CSV 列名的下拉列表中)

标签: r shiny rscript


【解决方案1】:

您只需添加fileUploader 逻辑以相应地填充my_data

ui <- fluidPage(
   sidebarLayout(
      sidebarPanel(
         fileInput("file1", "Choose CSV File", accept = ".csv"),
         checkboxInput("header", "Header", TRUE),
         selectInput("col", "Column to search:", NULL),
         textInput("old", "Replace:"),
         textInput("new", "By:"),
         actionButton("replace", "Replace!"),
      ),
      mainPanel(
         DTOutput("table1")
      )
   )
)

server <- function(input, output, session) {
   my_data <- reactiveVal(NULL)
   
   observeEvent(input$file1, {
      file <- input$file1
      ext <- tools::file_ext(file$datapath)
      req(file)
      validate(need(ext == "csv", "Please upload a csv file"))
      my_data(read.csv(file$datapath, header = input$header))
      updateSelectInput(session, "col", choices = names(my_data()))
   })
   
   observeEvent(input$replace, {
      req(input$col)
      dat <- req(my_data())
      traf <- if (is.numeric(dat[[input$col]])) as.numeric else identity
      my_data(dat %>%
                 mutate(!!rlang::sym(input$col) := 
                           replace(!!rlang::sym(input$col),
                                   as.character(!!rlang::sym(input$col)) == input$old,
                                   input$new) %>% 
                           traf()))
   })
   
   output$table1 <- renderDT(
      req(my_data())
   )
}

【讨论】:

  • 是的,效果很好。谢谢
猜你喜欢
  • 2021-11-25
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 2021-12-14
相关资源
最近更新 更多