J'ai été incapable de trouver une solution à ma requête sur le débordement de la pile. Cet article est similaire , mais mon jeu de données est légèrement - et surtout - différent (dans le fait que j'ai plusieurs mesures de «temps» dans ma variable de regroupement).
J'ai des observations d'organismes sur différents sites, au fil du temps. Les sites sont encore agrégés dans des zones plus vastes. Je tiens donc à avoir une fonction que je peux appeler DDPly pour résumer l'ensemble de données pour chacune des périodes de temps dans les zones géographiques. Cependant, j'ai du mal à obtenir la fonction dont j'ai besoin. P>
question strong> p> Comment puis-je parcourir les périodes de temps et comparer avec la période précédente, calculer l'intersection (c.-à-d. Nombre de "sites" survenant dans les deux périodes) et la somme du nombre survenant à chaque période? p> R version 3.1.2 (2014-10-31)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
3 Réponses :
Vous pouvez modifier la fonction
dist2 <- function(df){ Un1 <- unique(df$time) intersection <- numeric(length(Un1)) both <- numeric(length(Un1)) for(i in seq_along(Un1)){ intersection[i] <- length(which(df[df$time==Un1[i],"site"] %in% df[df$time==Un1[i-1],"site"])) both[i] <- length(unique(df[df$time==Un1[i],"site"])) + length(unique(df[df$time==Un1[i-1],"site"])) } return(data.frame(time=Un1, intersection, both)) } dist2(df) # time intersection both #1 1 0 4 #2 2 3 7 #3 3 3 8
Vous pouvez déterminer le nombre de fois que chaque site est apparu à chaque fois avec la fonction avec une seule manipulation simple, vous pouvez construire la même taille. table contenant le nombre de fois qu'un site est apparu à la période précédente: p> déterminer le nombre de sites en commun avec l'itération précédente ou le nombre de sites uniques dans le L'itération précédente plus le nombre de sites uniques dans l'itération actuelle est maintenant de simples opérations vectorisées: p> car cela ne nécessite pas de tas de Table code>:
intersection code > ou
appels uniques code> impliquant des paires de valeurs de temps, il devrait être plus efficace que les solutions de boucle: p>
Bon usage de la table, vraiment du code rapide. A fait au-dessus de la référence sur ma solution et il était légèrement supérieur à 10 fois plus lent que le vôtre, principalement en raison de rbind / make.unique code>
Voici ma mémoire Proposition intensive
time intersect both 1 1 0 4 2 2 3 7 3 3 3 8