2016-04-02 9 views
2

Ich habe Kamerafallen in einem Format mit Erfassungsdatum, Art und Anzahl der Personen für jede Beobachtung. Zum Beispiel:Definieren eines Wertebereichs für ddply {plyr} zur Verwendung bei der Erstellung von Kombinationen

> df 
     Date Sp Num 
1 1/1/2015 a 1 
2 1/1/2015 a 1 
3 1/1/2015 b 2 
4 1/3/2015 a 4 

würde Ich mag die Gesamtzahl der einzelnen Arten für einen bestimmten Tag aufgenommen summieren, sondern auch die Daten erweitern so eingestellt, dass es einen Eintrag für jedes Datum und Artenkombination ist, mit Null-Werten für Daten ohne Beobachtung einer bestimmten Art. Ich kann dies mit ddply {plyr} und dem .drop=FALSE Befehl tun.

> ddply(df, c("Date", "Sp"), function(df)sum(df$Num), .drop=FALSE) 
     Date Sp V1 
1 1/1/2015 a 2 
2 1/1/2015 b 2 
3 1/3/2015 a 4 
4 1/3/2015 b 0 

Das Problem ist, dass es einige Tage, in denen keine Beobachtungen für alle Arten gemacht wurden (in dem obigen Beispiel würde dies 2015.01.02 sein). Was ich möchte, ist zurück etwas wie folgt aus:

> df 
     Date Sp Num 
1 1/1/2015 a 2 
2 1/1/2015 b 2 
3 1/2/2015 a 0 
4 1/2/2015 b 0 
5 1/3/2015 a 4 
6 1/3/2015 b 0 

Gibt es eine Möglichkeit, eine Reihe von Daten in einem Vektor zu definieren und fragen ddply, dass der von der ursprünglichen Datenrahmen nur die einzigartigen Daten stattdessen verwenden?

Ich bin relativ neu zu R und SO, so entschuldige ich mich im Voraus, wenn dies zu einer Frage zu verworren ist.

Antwort

1

Wir konvertieren das "Datum" in Date Klasse. Erstellen Sie ein neues Dataset mit der Kombination der Sequenz vom Minimum bis zum Maximum "Datum" und den unique Elementen von "Sp". Entweder wir merge (von base R) oder left_join von dplyr, nachdem wir die sum der Spalte "Num" gruppiert nach "Date" und "Sp" erhalten.

df$Date <- as.Date(df$Date, "%m/%d/%Y") 
df1 <- expand.grid(Date=seq(min(df$Date), max(df$Date), 
    by = "1 day"), Sp=unique(df$Sp), stringsAsFactors=FALSE) 
library(dplyr) 
df %>% 
    group_by(Date, Sp) %>% 
    summarise(Num = sum(Num)) %>% 
    left_join(df1, .) %>% 
    mutate(Num = replace(Num, is.na(Num), 0)) %>% 
    arrange(Date) %>% 
    mutate(Date = format(Date, "%m/%d/%Y")) 
#  Date Sp Num 
#1 01/01/2015 a 2 
#2 01/01/2015 b 2 
#3 01/02/2015 a 0 
#4 01/02/2015 b 0 
#5 01/03/2015 a 4 
#6 01/03/2015 b 0 
+0

Danke für Ihre Antwort. An einigen Kamera-Standorten habe ich keine Beobachtung an den ersten oder letzten Tagen, daher definiere ich den Datumsbereich, da die Min/Max-Daten keine Tage enthalten, an denen ich keine Beobachtungen notieren muss. Ich habe versucht, den Datumsbereich als zu definieren 'expand.grid (Datum = seq (min (2015-1-1), max (2015-1-20), von =" 1 Tag ")' aber es scheint nicht zu funktionieren. Wie kann ich den Datumsbereich definieren? ? –

+0

@etis Wenn man '2015-1-1' betrachtet, ist es nicht von der Klasse" Date ". Konvertiere in die Klasse" Date "und erhalte dann die' seq' von 'min' und' max – akrun