我想使用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) {
拜托,你有意见吗?
非常感谢。
答案 0 :(得分:2)
决定看看我需要进行一些dply
练习。但事实证明,这需要使用类似tidyr
(具有函数complete
和spread
)的东西来使一切正常运行。
核心问题是,由于某些组合的原始数据框中没有记录,某些条目最终会丢失。这就像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)
产量: