2016-03-31 14 views
-2

Ich erhalte einen Fehler, bei dem meiner Meinung nach die Ursache darin liegt, dass in meinen Gruppierungen keine Werte für alle Gruppen vorhanden sind.Füllen Sie alle Elemente in der Gruppierung aus R

Daten können hier heruntergeladen werden: https://opendata.miamidade.gov/311/311-Service-Requests-Miami-Dade-County/dj6j-qg5t

Was ich zu tun ist, möchte eine Funktion haben, die eine verschachtelte Gruppierung nimmt und erkennt alle Löcher und auffüllt Nullen. Lets nehmen Probe den folgenden Code:

d <- rDSamp %>% 
    FilterDateRange("Ticket.Created.Date...Time", "1/1/2013", "12/31/2013") %>% 
    group_by(Ticket.Created.Date...Time, Case.Owner) %>% 
    summarise(
    count = n() 
) %>% 
    arrange(Ticket.Created.Date...Time) 

Nach dem summarise, ich brauche eine Funktion hinzuzufügen, die durch jeden Tag geht, und wenn der Fall Inhaber nicht in diesem Zeitpunkt nicht vorhanden ist, den Fall Eigentümer erstellen, und ein hinzufügen Zahl von 0.

Hier ist der Code zu diesem Punkt zu kommen:

library("ggvis") 
library("magrittr") 
library("dplyr") 
library("tidyr") 
library("shiny") 
library("checkpoint") 

checkpoint("2016-03-29") 

rData <- read.csv("C:\\data\\Miami_311.csv", 
       header=TRUE, 
       sep=",") 
rDSamp <- rData[sample(1:length(rData$Case.Owner), 1000),] 
rDSamp = rData %>% 
    subset(
     Case.Owner == "Animal_Services" | 
     Case.Owner == "Waste_Management" | 
     Case.Owner == "Community_Information_and_Outreach" | 
     Case.Owner == "Waste_Management") 
rDSamp$Case.Owner = factor(rDSamp$Case.Owner) 
#Convert to known date time 
rDSamp$Ticket.Created.Date...Time <- 
    rDSamp$Ticket.Created.Date...Time %>% 
    as.POSIXct(format="%m/%d/%Y") %>% 
    as.character() 

FilterDateRange = function(data, feature, minDate, maxDate) { 
    minDate = minDate %>% 
      as.POSIXct(format="%m/%d/%Y") %>% 
      as.character() 
    maxDate = maxDate %>% 
      as.POSIXct(format="%m/%d/%Y") %>% 
      as.character() 
    result = subset(data, data[feature] <= maxDate) 
    subset(result, result[feature] >= minDate) 
} 

d <- rDSamp %>% 
    FilterDateRange("Ticket.Created.Date...Time", "1/1/2013", "12/31/2013") %>% 
    group_by(Ticket.Created.Date...Time, Case.Owner) %>% 
    summarise(
count = n() 
) %>% 
    arrange(Ticket.Created.Date...Time) 

Für die endgültigen Informationen, ich versuche ggvis layer_smooths und es berichtet zu verwenden na von coersion eingeführt ist, ist meine Vermutung Löcher in den Daten verursacht dies.

eine Lösung gefunden, für mehr generische Suche ...

FillDataHolesWithZeros = function(input){ 
    countZero = input %>% 
    group_by(Ticket.Created.Date...Time) %>% 
    summarise(count = n()) %>% 
    filter(count < length(levels(input$Case.Owner))) 
    for(i in 1:nrow(countZero)) 
    { 
date = countZero[i,]$Ticket.Created.Date...Time 
departments = input %>% filter(Ticket.Created.Date...Time == date) 
myLevels = levels(input$Case.Owner) 
for(j in 1:nrow(departments)) 
{ 
    owner = departments[j,]$Case.Owner 
    myLevels = myLevels[myLevels != owner] 
} 
print(paste(i,":",myLevels)) 
for(k in 1:length(myLevels)){ 
    input = input %>% rbind(data.frame(
    Ticket.Created.Date...Time = date, 
    Case.Owner = myLevels[k], 
    count = 0 
    )) 
    } 
    } 
    return(input) 
} 
+0

Shiny-Tag, weil es eine glänzende Visualisierung antreibt, die den Fehler verursacht. Die glatte Handlung ist im Sterben begriffen. –

+0

Für die NA-Frage, mein Datenrahmen hat keine NAs, bis ich versuche, die Handlung durchzuführen. Das Problem ist, dass der Datenrahmen vollständig ist. Wenn Sie jedoch nach Datum gruppieren, gibt es für einige der Fallbesitzer keine Zeilen, da an diesem Tag keine Anrufe für diese Abteilung getätigt wurden. Ich muss herausfinden, wie man Zeilen für diese Tage hinzufügt, in denen keine Besitzer existieren. –

+0

Also nur Problem zeigen, haben Sie Daten.Rahmen mit Datumsspalte und Ihre haben Liste aller möglicher Daten (oder Intervall) und whant, um data.frame Zeilen hinzuzufügen? – Batanichek

Antwort

1

Versuchen

zum Beispiel

DATA

(für zukünftige Versuch zeigt reproduceble Daten und konkretes Problem)

Date=c(rep("2016-01-01",2),rep("2016-01-02",3),rep("2016-01-03",4)) 
CaseOwner=c(letters[1:2],letters[1:3],letters[1:4]) 
CallCount=1:9 
dat1=data.frame(Date, CaseOwner, CallCount) 

Gruppe + hinzufügen Reihe

library(dplyr) 
library(tidyr) 
dat1%>%group_by(Date,CaseOwner)%>%summarize(cnt=max(CallCount))%>%complete(CaseOwner, fill = list(cnt = 0)) 

Ergebnis

Source: local data frame [12 x 3] 

     Date CaseOwner cnt 
     (fctr) (fctr) (dbl) 
1 2016-01-01   a  1 
2 2016-01-01   b  2 
3 2016-01-01   c  0 
4 2016-01-01   d  0 
5 2016-01-02   a  3 
6 2016-01-02   b  4 
7 2016-01-02   c  5 
8 2016-01-02   d  0 
9 2016-01-03   a  6 
10 2016-01-03   b  7 
11 2016-01-03   c  8 
12 2016-01-03   d  9 

zusätzliches

1) %in% -Look ziemlich dann einig |

rDSamp = rData %>% 
    subset(
     Case.Owner == "Animal_Services" | 
     Case.Owner == "Waste_Management" | 
     Case.Owner == "Community_Information_and_Outreach" | 
     Case.Owner == "Waste_Management") 

auf

änderbar
rDSamp = rData[rData$Case.Owner %in% 
c("Animal_Services","Waste_Management","Community_Information_and_Outreach","Waste_Management"),] 

2), wenn Sie Datum vergleichen möchten Ihr nicht konvertieren müssen es

maxDate = maxDate %>% 
      as.POSIXct(format="%m/%d/%Y") %>% 
      as.character() 

und

data[feature] <= maxDate 

als String verglichen werden verkohlen.

+0

Ich stellte einen Link zur Verfügung, wo Sie die Daten herunterladen können. –

+0

Tolle Anmerkung zu den Teilmengen. An den Terminen hatte ich Probleme, bei der Konvertierung direkt zu einem Datum einige seltsame Artefakte zu hinterlassen, ich werde meine Sitzung löschen und es erneut versuchen. –

+0

Nicht jeder will und nicht alle können Ihre Daten herunterladen (mein Proxy auf der Arbeit nicht geben) besser smthing verwenden, die jeder kopieren kann Paste – Batanichek

Verwandte Themen