Ich konnte keine Lösung für meine Abfrage auf Stack Overflow finden. This post is similar, aber mein Datensatz ist leicht - und wichtig - anders (ich habe mehrere Maße für 'Zeit' innerhalb meiner Gruppierungsvariablen).Funktion zum Berechnen von Werten zum Vergleichen sequentieller Zeiträume
Ich habe Beobachtungen von Organismen an verschiedenen Standorten, im Laufe der Zeit. Die Standorte werden weiter zu größeren Gebieten zusammengefasst, daher möchte ich eventuell eine Funktion haben, die ich in ddply aufrufen kann, um den Datensatz für jeden der Zeiträume innerhalb der geographischen Gebiete zusammenzufassen. Ich habe jedoch Probleme, die Funktion zu bekommen, die ich brauche.
Frage
Wie fahre ich durch Zeitperioden und mit dem vorherigen Zeitraum vergleichen, Berechnen der Kreuzung (dh Anzahl von ‚Sites‘ in beiden Zeiträumen auftritt) und die Summe der Zahl auftretenden jede Periode?
Toy-Datensatz:
time = c(1,1,1,1,2,2,2,3,3,3,3,3)
site = c("A","B","C","D","A","B","C","A","B","C","D","E")
df <- as.data.frame(cbind(time,site))
df$time = as.numeric(df$time)
Meine Funktion
dist2 <- function(df){
for(i in unique(df$time))
{
intersection <- length(which(df[df$time==i,"site"] %in% df[df$time==i- 1,"site"]))
both <- length(unique(df[df$time==i,"site"])) + length(unique(df[df$time==i-1,"site"]))
}
return(as.data.frame(cbind(time,intersection,both)))
}
dist2(df)
Was erhalte ich:
dist2(df) time intersection both 1 1 3 8 2 1 3 8 3 1 3 8 4 1 3 8 5 2 3 8 6 2 3 8 7 2 3 8 8 3 3 8 9 3 3 8 10 3 3 8 11 3 3 8 12 3 3 8
Was ich erwarte, dass (! Gehofft) zu erreichen:
time intersection both
1 1 NA 4
2 2 3 7
3 3 3 8
Einmal habe ich eine Arbeitsfunktion haben, möchte ich es auf dem gesamten Datensatz mit ddply verwenden diese Werte für jeden Bereich zu berechnen.
Vielen Dank für Hinweise, Tipps, Ratschläge!
Ich betreibe:
R version 3.1.2 (2014-10-31)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Gute Verwendung der Tabelle, wirklich schneller Code. Hat oben Benchmark auf meiner Lösung und es war etwas mehr als 10 mal langsamer als deins, hauptsächlich wegen 'rbind/make.unique' – Pafnucy