7
votes

Fonction pour calculer les valeurs comparant des périodes de temps séquentielles

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>

Jouet Dataset: strong> P>

R version 3.1.2 (2014-10-31)
Platform: x86_64-apple-darwin13.4.0 (64-bit)


0 commentaires

3 Réponses :


1
votes

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


0 commentaires

4
votes

Vous pouvez déterminer le nombre de fois que chaque site est apparu à chaque fois avec la fonction Table : xxx

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: xxx

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: xxx

car cela ne nécessite pas de tas de intersection ou appels uniques impliquant des paires de valeurs de temps, il devrait être plus efficace que les solutions de boucle: xxx


1 commentaires

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



1
votes

Voici ma mémoire Proposition intensive

  time intersect both
1    1         0    4
2    2         3    7
3    3         3    8


0 commentaires