2017-01-06 13 views
1

group_byコマンドを使用して、光沢のある動的データフレームを作成します。R shiny dplyr GROUP_BYコマンドのエントリがありません

所望のテーブルの行数は、RVの$ VARの値に依存します。行の数はCL ==「1」 とCLの間で異なっているように、いくつかの地区は(010102、010103,160101) が空いているハウジングを持っていないので

==「2」、それは動作しません。

に住宅の種類ごとに同じ数の行を得るために、これらの区域を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) { 

、あなたのアイデアを持っているでしょうしてください?

ありがとうございました。私はとにかく、いくつかのdply練習を必要に応じて

答えて

2

は、ルックをすることにしました。しかし、このことは、すべてが正しく機能するように、tidyrのようなもの(機能はcompletespreadです)を使用する必要があることが判明しています。

コアの問題は、エントリの一部が原因特定の組み合わせのために元のデータフレームにはレコードが存在しないという事実のために行方不明に終わるということです。これは、対応するデータレコードのない潜在的なエントリを除外する通常の左右の結合動作とは対照的に、SQLの「FULL OUTER JOIN」が処理する問題のようなものです。要約レコードの一部が原因という自然の欠落データに現れないとき、あなたの出力は「完全」にする因子レベルと

complete作品。だから、私は地区とCOUNとCLをこれに影響を与える要因にしなければなりませんでした。

spreadは、複数の列に単一列の値を広げ - いわゆる「ワイド」データに「長い」データを変換します。

私はそれのうち、完全な(っぽい)の例を作りました。正確性を厳密にテストしていない。

降伏
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

+0

をとても素晴らしいです!私は感心しています、それはまさに私がやりたいことです。自分のコードを自分のプログラムに適応させます。マイクありがとうございました。 –

+1

upvoteにも感謝します。 –

+0

申し訳ありませんが、解決マークの上にある上向きの矢印をクリックするようにお願いしますか?はいの場合は、もう一度、ありがとうございます。 –

関連する問題