Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 8.35 KB | None | 0 0
  1. library(shiny)
  2.  
  3. ui <- fluidPage(
  4.   fluidRow(
  5.     column(12,
  6.            fileInput("data",
  7.                      "Upload Smoker Data",
  8.                      accept = c("text/xlsx", ".xlsx")
  9.            ), align="center")
  10.   ),
  11.  
  12.   navbarPage("App Title",
  13.              
  14.     tabPanel("User stats",
  15.       fluidRow(
  16.         column(12, numericInput("userIndex",
  17.                                 label = h3("Select User"),
  18.                                 value = 1, max = 32, min = 1),
  19.                align="center")
  20.       ),
  21.      
  22.       fluidRow(
  23.         column(4, h3("Cigarettes mode"), align="center"),
  24.         column(4, h3("Number of cigarettes per day"), align="center"),
  25.         column(4, h3("Mean smoking pattern per weekday"), align="center")
  26.       ),
  27.      
  28.       fluidRow(
  29.         column(4, plotOutput(outputId ="plotUserCigarettesModes")),
  30.         column(4, plotOutput(outputId ="plotUserDaySmoked")),
  31.         column(4, plotOutput(outputId = "plotUserMeanWeekday"))
  32.       ),
  33.      
  34.       fluidRow(
  35.         column(4, h3("Cigarettes mode (Pie)"), align="center"),
  36.         column(4, h3("Number of cigarettes per interval"), align="center"),
  37.         column(4, h3("Improvements"), align="center")
  38.       ),
  39.      
  40.       fluidRow(
  41.         column(4, plotOutput(outputId ="plotPieModes")),
  42.         column(4, plotOutput(outputId="plotIntervalStats")),
  43.         column(2, numericInput("improvementWeek", label = h3("Weekly Improvements"), value = 1, max = 12, min = 1), align="center"),
  44.         column(2, htmlOutput(outputId = "userImprovements"))
  45.        
  46.       )
  47.      
  48.      
  49.      
  50.     ),
  51.    
  52.     tabPanel("General stats",
  53.       fluidRow(column(12, h1("General Hourly Mean per Weekday"), align="center")),
  54.       fluidRow(column(12, h4("Loading can take a few seconds..."))),
  55.       fluidRow(column(3), column(6, plotOutput(outputId = "plotMeanWeekday")))
  56.     )
  57.    
  58.   )
  59. )
  60.  
  61. # Define server logic required to draw a histogram ----
  62. server <- function(input, output) {
  63.   # library imports
  64.   library(readxl)
  65.   library(ggplot2)
  66.  
  67.   Sys.setlocale("LC_TIME", "C")
  68.  
  69.   dataInput <- reactive({
  70.     validate(
  71.       need(input$data != "", "Please select a data set")
  72.     )
  73.    
  74.     inFile <- input$data
  75.    
  76.     userdata <- read_excel(inFile$datapath)
  77.     userdata$Weekday <- weekdays(as.Date(userdata$Time))
  78.     userdata$Weekday <- as.factor(userdata$Weekday)
  79.     userdata$User <- as.factor(userdata$User)
  80.     userdata$Day <- as.Date(userdata$Time,format="%d-%m-%y")
  81.     userdata$Type <- as.factor(userdata$Type)
  82.    
  83.     userdata
  84.   })
  85.  
  86.   userData <- reactive({
  87.     validate(
  88.       need(!is.null(input$userIndex), "Please select a user")
  89.     )
  90.    
  91.     userdata <- dataInput()
  92.     userdata[userdata == input$userIndex,]
  93.   })
  94.  
  95.  
  96.   smokedData <- reactive({
  97.     userdata <- userData()
  98.     smoked <- userdata[! userdata$Type %in% c("Auto skipped", "Friend", "Skipped"),]
  99.     smoked
  100.   })
  101.  
  102.   smokedData <- reactive({
  103.     userdata <- userData()
  104.     smoked <- userdata[! userdata$Type %in% c("Auto skipped", "Friend", "Skipped"),]
  105.     smoked$Hour <- format(smoked$Time,"%H")
  106.     smoked$Interval <- "0-5:59"
  107.     smoked[as.numeric(smoked$Hour) %in% c(6:11),]$Interval <- "6-11:59"
  108.     smoked[as.numeric(smoked$Hour) %in% c(12:17),]$Interval <- "12-17:59"
  109.     smoked[as.numeric(smoked$Hour) %in% c(18:23),]$Interval <- "18-23:59"
  110.    
  111.     smoked$Interval = factor(smoked$Interval, levels= c("0-5:59", "6-11:59", "12-17:59", "18-23:59"))
  112.     smoked <- smoked[order(smoked$Interval), ]
  113.    
  114.     smoked
  115.   })
  116.  
  117.   daySmokedData <- reactive({
  118.     smoked <- smokedData()
  119.     day.smoked <- aggregate(smoked$User, by = list(smoked$User, smoked$Day, smoked$Weekday), FUN = length)
  120.     names(day.smoked) <- c("User", "Day", "Weekday", "count")
  121.     day.smoked$Weekday = factor(day.smoked$Weekday, levels= c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"))
  122.     day.smoked[order(day.smoked$Weekday), ]
  123.     day.smoked
  124.   })
  125.  
  126.   meanUserSmokedData <- reactive({
  127.     day.smoked <- daySmokedData()
  128.     day.smoked.mean <- as.data.frame(aggregate(day.smoked$count, by = list(day.smoked$User, day.smoked$Weekday), FUN = mean))
  129.     day.smoked.sd <- as.data.frame(aggregate(day.smoked$count, by = list(day.smoked$User, day.smoked$Weekday), FUN = sd))
  130.     names(day.smoked.mean) <- c("User", "Weekday", "mean")
  131.     names(day.smoked.sd) <- c("User ", "Weekday", "sd")
  132.     day.smoked.sd$sd[is.na(day.smoked.sd$sd)] <- 0
  133.     day.smoked.mean$sd <- day.smoked.sd$sd
  134.     day.smoked.mean
  135.   })
  136.  
  137.   improvements <- reactive({
  138.     validate(
  139.       need(!is.null(input$improvementWeek), "Select a week")  
  140.     )
  141.    
  142.     df <- smokedData()
  143.     d <- aggregate(df$Day, by=list(df$Type, df$User), FUN=max)
  144.     names(d) <- c("Type", "User", "End")
  145.  
  146.     week <- data.frame(row.names = c("User", "Type", "Time", "Weekday", "Day"))
  147.     week <- na.omit(df[
  148.                     (df$Day > d[d$Type == "Observation week",]$End+8*(input$improvementWeek-1)) &
  149.                     (df$Day <= d[d$Type == "Observation week",]$End + 8*(input$improvementWeek))
  150.                   ,])
  151.                
  152.     if(nrow(week) == 0){
  153.       return("<h1>0%</h1>")
  154.     }
  155.    
  156.    
  157.     week.sum <- aggregate(week$User, by=list(week$User), FUN=length)$x
  158.    
  159.     observation.sum <- aggregate(df[df$Type=="Observation week",]$User, by=list(df[df$Type=="Observation week",]$User), FUN=length)$x
  160.     week.improvements <- (observation.sum - week.sum) / observation.sum
  161.    
  162.     if(week.improvements > 0)
  163.       paste(c("<h1 style='color:green'>",as.character(round(week.improvements * 100, digit=2)),"%</h1>"), sep = " ")
  164.     else
  165.       paste(c("<h1 style='color:red'>",as.character(round(week.improvements * 100, digit=2)),"%</h1>"), sep = " ")
  166.   })
  167.  
  168.   output$userImprovements <- renderText({
  169.     improvements()
  170.   })
  171.  
  172.  
  173.   output$plotUserCigarettesModes <- renderPlot({
  174.     ggplot(userData()) + aes(x=Type, fill = Type) + geom_bar() + xlab("Type of cigarette") + ylab("Number of Cigarettes") + labs(fill = "Used mode")
  175.   })
  176.  
  177.   output$plotUserDaySmoked <- renderPlot({
  178.     ggplot(meanUserSmokedData(),aes(x=Weekday, y=mean, group=User, colour=mean)) + geom_line(size=.5) + geom_point(size=5) +
  179.       geom_errorbar(aes(ymin=mean-sd, ymax=mean+sd), width=.2, position=position_dodge(.9))
  180.    
  181.   })
  182.  
  183.   output$plotUserMeanWeekday <- renderPlot({
  184.     smoked = smokedData()
  185.    
  186.     smoked$Hour <- format(smoked$Time,"%H")
  187.     hour.smoked <- as.data.frame(aggregate(smoked$User, by = list(smoked$User, smoked$Day, smoked$Weekday, smoked$Hour), FUN = length))
  188.     names(hour.smoked) <- c("User", "Day", "Weekday", "Hour", "count")
  189.     hour.smoked.mean <- as.data.frame(aggregate(hour.smoked$count, by = list(hour.smoked$Weekday, hour.smoked$Hour), FUN = mean))
  190.     names(hour.smoked.mean) <- c("Day", "Hour", "mean")
  191.     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")
  192.   })
  193.  
  194.   output$plotMeanWeekday <- renderPlot({
  195.     smoked = dataInput()
  196.    
  197.     smoked$Hour <- format(smoked$Time,"%H")
  198.     hour.smoked <- as.data.frame(aggregate(smoked$User, by = list(smoked$User, smoked$Day, smoked$Weekday, smoked$Hour), FUN = length))
  199.     names(hour.smoked) <- c("User", "Day", "Weekday", "Hour", "count")
  200.     hour.smoked.mean <- as.data.frame(aggregate(hour.smoked$count, by = list(hour.smoked$Weekday, hour.smoked$Hour), FUN = mean))
  201.     names(hour.smoked.mean) <- c("Day", "Hour", "mean")
  202.     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")
  203.   })
  204.  
  205.   output$plotPieModes <- renderPlot({
  206.     userdata <- userData()
  207.     userdata$Type <- as.factor(userdata$Type)
  208.     lbls <- levels(userdata$Type)
  209.     lbls <- paste(lbls, round(prop.table(table(userdata$Type))*100))
  210.     lbls <- paste(lbls, "%", spe="")
  211.     modes <- with(userdata, aggregate(User, by=list(Type), FUN=length))
  212.     names(modes) <- c("Mode", "count")
  213.     pie(modes$count, labels = lbls, main="Mode distribution")
  214.   })
  215.  
  216.   output$plotIntervalStats <- renderPlot({
  217.     ggplot(smokedData()) + aes(x=Interval, fill = Type) + geom_bar() + xlab("Intervals") + ylab("Number of Cigarets") + labs(fill = "Used mode")
  218.   })
  219.  
  220. }
  221.  
  222. shinyApp(ui = ui, server = server)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement