Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- library(shiny)
- ui <- fluidPage(
- fluidRow(
- column(12,
- fileInput("data",
- "Upload Smoker Data",
- accept = c("text/xlsx", ".xlsx")
- ), align="center")
- ),
- navbarPage("App Title",
- tabPanel("User stats",
- fluidRow(
- column(12, numericInput("userIndex",
- label = h3("Select User"),
- value = 1, max = 32, min = 1),
- align="center")
- ),
- fluidRow(
- column(4, h3("Cigarettes mode"), align="center"),
- column(4, h3("Number of cigarettes per day"), align="center"),
- column(4, h3("Mean smoking pattern per weekday"), align="center")
- ),
- fluidRow(
- column(4, plotOutput(outputId ="plotUserCigarettesModes")),
- column(4, plotOutput(outputId ="plotUserDaySmoked")),
- column(4, plotOutput(outputId = "plotUserMeanWeekday"))
- ),
- fluidRow(
- column(4, h3("Cigarettes mode (Pie)"), align="center"),
- column(4, h3("Number of cigarettes per interval"), align="center"),
- column(4, h3("Improvements"), align="center")
- ),
- fluidRow(
- column(4, plotOutput(outputId ="plotPieModes")),
- column(4, plotOutput(outputId="plotIntervalStats")),
- column(2, numericInput("improvementWeek", label = h3("Weekly Improvements"), value = 1, max = 12, min = 1), align="center"),
- column(2, htmlOutput(outputId = "userImprovements"))
- )
- ),
- tabPanel("General stats",
- fluidRow(column(12, h1("General Hourly Mean per Weekday"), align="center")),
- fluidRow(column(12, h4("Loading can take a few seconds..."))),
- fluidRow(column(3), column(6, plotOutput(outputId = "plotMeanWeekday")))
- )
- )
- )
- # Define server logic required to draw a histogram ----
- server <- function(input, output) {
- # library imports
- library(readxl)
- library(ggplot2)
- Sys.setlocale("LC_TIME", "C")
- dataInput <- reactive({
- validate(
- need(input$data != "", "Please select a data set")
- )
- inFile <- input$data
- userdata <- read_excel(inFile$datapath)
- userdata$Weekday <- weekdays(as.Date(userdata$Time))
- userdata$Weekday <- as.factor(userdata$Weekday)
- userdata$User <- as.factor(userdata$User)
- userdata$Day <- as.Date(userdata$Time,format="%d-%m-%y")
- userdata$Type <- as.factor(userdata$Type)
- userdata
- })
- userData <- reactive({
- validate(
- need(!is.null(input$userIndex), "Please select a user")
- )
- userdata <- dataInput()
- userdata[userdata == input$userIndex,]
- })
- smokedData <- reactive({
- userdata <- userData()
- smoked <- userdata[! userdata$Type %in% c("Auto skipped", "Friend", "Skipped"),]
- smoked
- })
- smokedData <- reactive({
- userdata <- userData()
- smoked <- userdata[! userdata$Type %in% c("Auto skipped", "Friend", "Skipped"),]
- smoked$Hour <- format(smoked$Time,"%H")
- smoked$Interval <- "0-5:59"
- smoked[as.numeric(smoked$Hour) %in% c(6:11),]$Interval <- "6-11:59"
- smoked[as.numeric(smoked$Hour) %in% c(12:17),]$Interval <- "12-17:59"
- smoked[as.numeric(smoked$Hour) %in% c(18:23),]$Interval <- "18-23:59"
- smoked$Interval = factor(smoked$Interval, levels= c("0-5:59", "6-11:59", "12-17:59", "18-23:59"))
- smoked <- smoked[order(smoked$Interval), ]
- smoked
- })
- daySmokedData <- reactive({
- smoked <- smokedData()
- day.smoked <- aggregate(smoked$User, by = list(smoked$User, smoked$Day, smoked$Weekday), FUN = length)
- names(day.smoked) <- c("User", "Day", "Weekday", "count")
- day.smoked$Weekday = factor(day.smoked$Weekday, levels= c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"))
- day.smoked[order(day.smoked$Weekday), ]
- day.smoked
- })
- meanUserSmokedData <- reactive({
- day.smoked <- daySmokedData()
- day.smoked.mean <- as.data.frame(aggregate(day.smoked$count, by = list(day.smoked$User, day.smoked$Weekday), FUN = mean))
- day.smoked.sd <- as.data.frame(aggregate(day.smoked$count, by = list(day.smoked$User, day.smoked$Weekday), FUN = sd))
- names(day.smoked.mean) <- c("User", "Weekday", "mean")
- names(day.smoked.sd) <- c("User ", "Weekday", "sd")
- day.smoked.sd$sd[is.na(day.smoked.sd$sd)] <- 0
- day.smoked.mean$sd <- day.smoked.sd$sd
- day.smoked.mean
- })
- improvements <- reactive({
- validate(
- need(!is.null(input$improvementWeek), "Select a week")
- )
- df <- smokedData()
- d <- aggregate(df$Day, by=list(df$Type, df$User), FUN=max)
- names(d) <- c("Type", "User", "End")
- week <- data.frame(row.names = c("User", "Type", "Time", "Weekday", "Day"))
- week <- na.omit(df[
- (df$Day > d[d$Type == "Observation week",]$End+8*(input$improvementWeek-1)) &
- (df$Day <= d[d$Type == "Observation week",]$End + 8*(input$improvementWeek))
- ,])
- if(nrow(week) == 0){
- return("<h1>0%</h1>")
- }
- week.sum <- aggregate(week$User, by=list(week$User), FUN=length)$x
- observation.sum <- aggregate(df[df$Type=="Observation week",]$User, by=list(df[df$Type=="Observation week",]$User), FUN=length)$x
- week.improvements <- (observation.sum - week.sum) / observation.sum
- if(week.improvements > 0)
- paste(c("<h1 style='color:green'>",as.character(round(week.improvements * 100, digit=2)),"%</h1>"), sep = " ")
- else
- paste(c("<h1 style='color:red'>",as.character(round(week.improvements * 100, digit=2)),"%</h1>"), sep = " ")
- })
- output$userImprovements <- renderText({
- improvements()
- })
- output$plotUserCigarettesModes <- renderPlot({
- ggplot(userData()) + aes(x=Type, fill = Type) + geom_bar() + xlab("Type of cigarette") + ylab("Number of Cigarettes") + labs(fill = "Used mode")
- })
- output$plotUserDaySmoked <- renderPlot({
- ggplot(meanUserSmokedData(),aes(x=Weekday, y=mean, group=User, colour=mean)) + geom_line(size=.5) + geom_point(size=5) +
- geom_errorbar(aes(ymin=mean-sd, ymax=mean+sd), width=.2, position=position_dodge(.9))
- })
- output$plotUserMeanWeekday <- renderPlot({
- smoked = smokedData()
- smoked$Hour <- format(smoked$Time,"%H")
- hour.smoked <- as.data.frame(aggregate(smoked$User, by = list(smoked$User, smoked$Day, smoked$Weekday, smoked$Hour), FUN = length))
- names(hour.smoked) <- c("User", "Day", "Weekday", "Hour", "count")
- hour.smoked.mean <- as.data.frame(aggregate(hour.smoked$count, by = list(hour.smoked$Weekday, hour.smoked$Hour), FUN = mean))
- names(hour.smoked.mean) <- c("Day", "Hour", "mean")
- ggplot(hour.smoked.mean) + aes(x=Hour, y=mean, group=Day, color=Day) + stat_smooth(size=1, method = 'lm', formula = y ~ poly(x,5), se=FALSE) + ggtitle("Mean smoking pattern per weekday")
- })
- output$plotMeanWeekday <- renderPlot({
- smoked = dataInput()
- smoked$Hour <- format(smoked$Time,"%H")
- hour.smoked <- as.data.frame(aggregate(smoked$User, by = list(smoked$User, smoked$Day, smoked$Weekday, smoked$Hour), FUN = length))
- names(hour.smoked) <- c("User", "Day", "Weekday", "Hour", "count")
- hour.smoked.mean <- as.data.frame(aggregate(hour.smoked$count, by = list(hour.smoked$Weekday, hour.smoked$Hour), FUN = mean))
- names(hour.smoked.mean) <- c("Day", "Hour", "mean")
- ggplot(hour.smoked.mean) + aes(x=Hour, y=mean, group=Day, color=Day) + stat_smooth(size=1, method = 'lm', formula = y ~ poly(x,6), se=FALSE) + ggtitle("Mean smoking pattern per weekday")
- })
- output$plotPieModes <- renderPlot({
- userdata <- userData()
- userdata$Type <- as.factor(userdata$Type)
- lbls <- levels(userdata$Type)
- lbls <- paste(lbls, round(prop.table(table(userdata$Type))*100))
- lbls <- paste(lbls, "%", spe="")
- modes <- with(userdata, aggregate(User, by=list(Type), FUN=length))
- names(modes) <- c("Mode", "count")
- pie(modes$count, labels = lbls, main="Mode distribution")
- })
- output$plotIntervalStats <- renderPlot({
- ggplot(smokedData()) + aes(x=Interval, fill = Type) + geom_bar() + xlab("Intervals") + ylab("Number of Cigarets") + labs(fill = "Used mode")
- })
- }
- shinyApp(ui = ui, server = server)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement