Non riesco a trovare una soluzione alla mia interrogazione su Stack Overflow. This post is similar, ma il mio set di dati è leggermente - e soprattutto - diverso (nel senso che ho più misure di "tempo" all'interno della mia variabile di raggruppamento).Funzione per calcolare i valori di periodi di tempo sequenziali
Ho osservazioni di organismi in vari siti, nel tempo. I siti sono ulteriormente aggregati in aree più grandi, quindi desidero infine avere una funzione che posso chiamare in ddply per riassumere il set di dati per ciascuno dei periodi di tempo all'interno delle aree geografiche. Tuttavia, sto avendo problemi ad ottenere la funzione di cui ho bisogno.
Domanda
Come fare scorrere periodi di tempo e confrontarlo con il periodo di tempo precedente, calcolando l'intersezione (cioè il numero di 'siti' si verificano in entrambi i periodi di tempo) e la somma del numero che si verificano in ogni periodo?
Toy set di dati:
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)
La mia funzione
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)
Cosa ottengo:
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
quello che mi aspetto (! Sperato) per ottenere:
time intersection both
1 1 NA 4
2 2 3 7
3 3 3 8
Una volta che ho una funzione di lavoro, voglio usarlo con ddply su tutto il set di dati per calcolare questi valori per ogni area.
Molte grazie per eventuali suggerimenti, consigli, consigli!
Sono in esecuzione:
R version 3.1.2 (2014-10-31)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Buon uso della tabella, codice veramente veloce. Ha superato il benchmark sulla mia soluzione ed era leggermente oltre 10 volte più lento del tuo, principalmente a causa di 'rbind/make.unique' – Pafnucy