R shiny dplyr GROUP_BY命令缺少条目

时间:2017-01-06 03:44:07

标签: r dataframe shiny dplyr

我想使用group_by命令创建一个动态数据框。

所需表的行数取决于rv $ VAR值。

由于CL ==“1”之间的行数不同 和CL ==“2”,因为有些地区(010102,010103,160101) 没有空置的外壳,它不起作用。

如何才能在表格中显示0区域 每种住房的行数相同?

这是我表格的一部分:

PC;COUN;DISTRICT;HOUSING;CL
01:0101;  010101;     01; 1
01:0101;  010101;     02; 1
01:0101;  010101;     03; 1
01:0101;  010101;     04; 2
01:0101;  010101;     05; 1
01:0102;  010102;     01; 1
01:0102;  010102;     02; 1
01:0102;  010102;     03; 1
01:0102;  010102;     04; 1
01:0102;  010102;     05; 1
01:0103;  010103;     01; 1
01:0103;  010103;     02; 1
01:0103;  010103;     03; 1
01:0103;  010103;     04; 1
01:0103;  010103;     05; 1
15:1501;  150101;     01; 1
15:1501;  150101;     02; 2
15:1501;  150101;     03; 1
15:1501;  150101;     04; 1
15:1501;  150101;     05; 1
16:1601;  160101;     01; 1
16:1601;  160101;     02; 1
16:1601;  160101;     03; 1
16:1601;  160101;     04; 1
21:2101;  210101;     01; 1
21:2101;  210101;     02; 1
21:2101;  210101;     03; 2
21:2101;  210101;     04; 1
21:2101;  210101;     05; 2
25:2501;  250101;     01; 1
25:2501;  250101;     02; 1
25:2501;  250101;     03; 1

这是我写的代码的一部分:

selectionAcc_View  <- reactive({

if (rv$CHAMP == "DISTRICT") {

      selectionAccomodations <- reactive({
        return(filter(myTable, DISTRICT %in% rv$VAR))})

tmp <- selectionAccomodations()

dfACC <- tmp %>%
    group_by(DISTRICT) %>%
    summarize(Accomodations=n())

dfMA <- filter(tmp, CL == "1" %>%
    group_by(DISTRICT) %>%
    summarize(MA=n())

dfVH <- filter(tmp, CL == "2" %>%
    group_by(DISTRICT) %>%
    summarize(VH=n())

# Create table
df <- data.frame(

    Total_Accomodations = c(dfACC$Accomodations), # Number of Accomodations

    Main_Accomodations = c(dfMA$MA), # Number of Main Accomodations

    Vacant_Housings = c(dfVH$VH) # Number of Vacant Housings

    ) # end of data.frame

  } # end of if

df

}) # End of selectionAcc_View  <- reactive({

# Output the table
output$df <- renderDataTable(selectionAcc_View(),options = list(paging =
FALSE, ordering = FALSE,searching = FALSE,info = FALSE)) 

}) # End of shinyServer(function(input, output, session) {

拜托,你有意见吗?

非常感谢。

1 个答案:

答案 0 :(得分:2)

决定看看我需要进行一些dply练习。但事实证明,这需要使用类似tidyr(具有函数completespread)的东西来使一切正常运行。

核心问题是,由于某些组合的原始数据框中没有记录,某些条目最终会丢失。这就像SQL中的“FULL OUTER JOIN”解决的问题,而不是正常的左右连接行为,这会导致潜在的条目没有相应的数据记录。

complete与因子级别一起使用,当某些摘要记录由于缺少该性质的数据而未显示时,使输出“完整”。因此,我必须将DISTRICT,COUN和CL纳入使用它的因素。

spread将单个列中的值分散到多个列中 - 因此将“长”数据转换为“宽”数据。

我做了一个完整的(ish)例子。没有严格测试正确性。

library(shiny)
library(dplyr)
library(tidyr)
myTable <- read.csv(sep=";",text=
'PC;COUN;DISTRICT;HOUSING;CL
01;0101;  010101;     01; 1
01;0101;  010101;     02; 1
01;0101;  010101;     03; 1
01;0101;  010101;     04; 2
01;0101;  010101;     05; 1
01;0102;  010102;     01; 1
01;0102;  010102;     02; 1
01;0102;  010102;     03; 1
01;0102;  010102;     04; 1
01;0102;  010102;     05; 1
01;0103;  010103;     01; 1
01;0103;  010103;     02; 1
01;0103;  010103;     03; 1
01;0103;  010103;     04; 1
01;0103;  010103;     05; 1
15;1501;  150101;     01; 1
15;1501;  150101;     02; 2
15;1501;  150101;     03; 1
15;1501;  150101;     04; 1
15;1501;  150101;     05; 1
16;1601;  160101;     01; 1
16;1601;  160101;     02; 1
16;1601;  160101;     03; 1
16;1601;  160101;     04; 1
21;2101;  210101;     01; 1
21;2101;  210101;     02; 1
21;2101;  210101;     03; 2
21;2101;  210101;     04; 1
21;2101;  210101;     05; 2
25;2501;  250101;     01; 1
25;2501;  250101;     02; 1
25;2501;  250101;     03; 1')
myTable$DISTRICT <- as.factor(myTable$DISTRICT)
myTable$COUN <- as.factor(myTable$COUN)
myTable$CL <- as.factor(myTable$CL)

u <- shinyUI(fluidPage(
  titlePanel("Housing Statistics"),
  sidebarLayout(position = "left",
           sidebarPanel(h3("sidebar panel"),
                        selectInput("champmode","CHAMP Mode",c("DISTRICT","COUNTY")),
                        uiOutput("uivarselect")
                       ),
           mainPanel(h3("main panel"),
                     dataTableOutput('outdf')
                     )
             )))

s <- shinyServer(function(input,output) {

  rv <- reactiveValues(VAR = NULL,CHAMP = NULL)

  observeEvent(input$champmode,{ rv$CHAMP = input$champmode })
  observeEvent(input$varmode,{ rv$VAR = input$varmode })

  output$uivarselect <- renderUI({
    req(input$champmode)
    if (rv$CHAMP == "DISTRICT") {
        vals <- unique(as.character(myTable$DISTRICT))
     } else {
        vals <- unique(as.character(myTable$COUN))
     }
    selectInput("varmode","VAR Mode",vals)
  })


  selectionAccomodations <- reactive({
      if (rv$CHAMP == "DISTRICT") {
        return(filter(myTable,DISTRICT %in% rv$VAR))
      } else {
        return(filter(myTable,COUN %in% rv$VAR))
      }
    })

  selectionAcc_View <- reactive({
        tmp <- selectionAccomodations()
        if (nrow(tmp)==0) return(tmp) # don't process empty dataframe, just display
        tmp <- group_by(tmp,DISTRICT,COUN,CL) %>% summarize(cn = n()) %>% complete(CL)
        tmp[is.na(tmp)] <- 0 # replace NAs with zero
        df <- spread(tmp,CL,cn)
        names(df) <- c("DISTRICT","COUN","Main_Accomodations","Vacant_Housings")
        df$Total_Accomodations <- df$Main_Accomodations + df$Vacant_Housings;
        return(df)
    })

    # Output the table
  output$outdf <- renderDataTable({
      req(input$varmode) # keep from display before we are set up
      selectionAcc_View()
      },options = list(paging = F,ordering = F,searching = F,info = F))
  }
)
shinyApp(ui=u,server=s)

产量:

enter image description here