2010-08-09 4 views
2

J'ai un ensemble de données que je dois calculer leur « moyenne consécutive » (je ne sais pas si elle est le nom correct, mais je ne peux pas trouver mieux), voici un exemple:comment calculer "moyenne consécutive" dans R sans utiliser de boucle, ou d'une manière plus efficace?

ID Var2 Var3  
1 A 1 
2 A 3 
3 A 5 
4 A 7 
5 A 9 
6 A 11 
7 B 2 
8 B 4 
9 B 6 
10 B 8 
11 B 10 

Ici, j'ai besoin de calculer la moyenne de 3 variables Var3 dans le même sous-ensemble consécutivement (ie il y aura 4 moyennes calculées pour A: moyenne (1,3,5), moyenne (3,5,7), moyenne (5,7 , 9), moyenne (7,9,11), et 3 moyennes calculées pour B: moyenne (2,4,6), moyenne (4,6,8), moyenne (6,8,10). devrait être:

ID Var2 Var3 Mean 
1 A 1 N/A 
2 A 3 N/A 
3 A 5 3 
4 A 7 5 
5 A 9 7 
6 A 11 9 
7 B 2 N/A 
8 B 4 N/A 
9 B 6 4 
10 B 8 6 
11 B 10 8 

Actuellement, j'utilise une approche de "boucle-dans-une-boucle", je sous-ensemble le dataset u chante Var2, puis j'ai calculé la moyenne dans un autre début à partir des troisièmes données.

Cela correspond à ce dont j'ai besoin, mais il est très lent, existe-t-il un moyen plus rapide pour ce problème?

Merci!

Répondre

3

On l'appelle généralement «moyenne mobile» ou «moyenne mobile». Le package plyr vous permet de calculer une fonction sur des segments de vos données et le package zoo comporte des méthodes pour effectuer des calculs.

> lines <- "ID,Var2,Var3  
+ 1,A,1 
+ 2,A,3 
+ 3,A,5 
+ 4,A,7 
+ 5,A,9 
+ 6,A,11 
+ 7,B,2 
+ 8,B,4 
+ 9,B,6 
+ 10,B,8 
+ 11,B,10" 
> 
> x <- read.csv(con <- textConnection(lines)) 
> close(con) 
> 
> ddply(x,"Var2",function(y) data.frame(y, 
+ mean=rollmean(y$Var3,3,na.pad=TRUE,align="right"))) 
    ID Var2 Var3 mean 
1 1 A 1 NA 
2 2 A 3 NA 
3 3 A 5 3 
4 4 A 7 5 
5 5 A 9 7 
6 6 A 11 9 
7 7 B 2 NA 
8 8 B 4 NA 
9 9 B 6 4 
10 10 B 8 6 
11 11 B 10 8 
+0

merci! mais qu'en est-il si var3 n'est pas commandé (ils doivent être triés par ID)? – lokheart

+0

Ensuite, commandez d'abord 'x' par' ID': 'x <- x [order (x $ ID),]' –

3

alternativement en utilisant la base R

x$mean <- unlist(tapply(x$Var3, x$Var2, zoo::rollmean, k=3, na.pad=TRUE, align="right", simplity=FALSE)) 
Questions connexes