2017-04-23 21 views
0

Ich habe einen großen Datensatz (> 3k Zeilen), den ich basierend auf dem geografischen Standort und dem Datum filtern möchte. Die Lage Filterung funktioniert gut, aber ich bekomme die folgende Fehlermeldung angezeigt, wenn logische Operatoren auf Daten unter Verwendung von mit filter (dplyr):Daten in R mit dplyr filtern

Error: level sets of factors are different 

meine aktuellen Codes ist wie folgt:

head(master.data) 
    State.Name County.Code Latitude Longitude Arithmetic.Mean Date.Local 
1  Alabama   3 30.49748 -87.88026    8.0 2014-01-02 
2  Alabama   3 30.49748 -87.88026    7.0 2014-01-05 
3  Alabama   3 30.49748 -87.88026    7.0 2014-01-08 
4  Alabama   3 30.49748 -87.88026    3.6 2014-01-11 
5  Alabama   3 30.49748 -87.88026    5.2 2014-01-14 
6  Alabama   3 30.49748 -87.88026    4.4 2014-01-17 

master.data$Date.Local <- as.Date(master.data$Date.Local, format = "%Y-%m-%d") 

site.info <- data.frame("Alabama", 3, 30, 90, "28/12/2015", "13/07/2016") 
names(site.info) <- c("State.Name", "County.Code", "Latitude", "Longitude", 
         "Date.Start", "Date.End") 
site.info$Date.Start <- as.Date(site.info$Date.Start, format = "%d/%m/%Y") 
site.info$Date.End <- as.Date(site.info$Date.End, format = "%d/%m/%Y") 

reduced.data <- filter(master.data, State.Name == site.info$State.Name, 
         Date.Local >= site.info$Date.Start 
         & Date.Local <= site.info$Date.End) 

Beide site.info und master.data haben die Daten formatiert mit as.Date. Das Eingabeformat ist anders, da sie aus externen Quellen importiert werden.

Ich bin in der Lage, logische Operationen auf den beiden mit den erwarteten Ergebnissen außerhalb von filter durchzuführen. Nicht sicher, warum das der Fall ist. Mit %in% die gleichen Ergebnisse

Date.Local %in% c(site.info$Date.Start, site.info$Date.End) 

Wie Ausbeuten kann ich dies funktioniert?

+0

Ich denke, Ihre 'State.Name == site.info $ State.Name' kann beunruhigend sein, wenn es mehr Elemente in 'site.info' gibt und es sich um eine' factor' Klasse handelt. Sie können eine 'Join' versuchen. Dies kann einfacher mit 'data.table' durchgeführt werden, zB' setDT (master.data) [site.info, on =. (State.Name, Date.Local> = Date.Start, Date.Local <= Date.End)] ' – akrun

+0

Ich werde das auch versuchen. 'site.info' hat nicht mehr als 12 Zeilen und die Daten werden mit' as.Date' formatiert, also bin ich neugierig, warum es nicht funktioniert. – Gautam

+1

Ihre State.Name-Spalte ist wahrscheinlich ein Faktor - mit unterschiedlichen Ebenen in jedem data.frame. Wenn Sie 'dput (head (master.data))' in Ihre Frage aufnehmen, können wir das sicher wissen. Wenn Sie diese Spalte nicht als Faktor haben wollen, lassen Sie sie nicht eins werden. EG benutze 'stringsAsFactors = FALSE' in' read.table' –

Antwort

0

Nach viel versucht, scheint es, dass subset funktioniert besser als filter in diesem Fall:

reduced.data <- subset(master.data, Latitude %in% closest.sites$Latitude 
         & Longitude %in% closest.sites$Longitude 
         & Date.Local >= site.info$Date.Start 
         & Date.Local <= site.info$Date.End) 

Der obige Code gibt mir genau die Ergebnisse, die ich will.

Jetzt bin ich stecken fest versuchen, alle Einträge mit dem gleichen Zeitstempel zu filtern - ich möchte alle Proben am selben Tag genommen und den Durchschnitt finden. Sowohl subset als auch filter scheinen in diesem Fall zu versagen. R ist weh.

Verwandte Themen