2014-02-16 40 views
0
x<-c("A","B") 
y<-c(1:10) 
dat<-expand.grid(visit=y,site=x) 

我想获得一个列,该列具有访问每个站点中前面行的平均值。首次访问将没有任何价值。R:计算前面行和组内的平均值

所以例子返回的数据

visit site mean 
    1 A  
    2 A  1 
    3 A 1.5 
    4 A  2 
    5 A 2.5 
    6 A  3 
    1 B etc.. 
+0

返回数据的例子意味着'Y = 1:6' –

回答

1

使用y = 1:6为此,在匹配问题的例子。

您可以bycumsum获得移动平均:

with(dat, by(visit, site, FUN=function(x) cumsum(x)/1:length(x))) 
## site: A 
## [1] 1.0 1.5 2.0 2.5 3.0 3.5 
## ----------------------------------------------------------------------------------------------------- 
## site: B 
## [1] 1.0 1.5 2.0 2.5 3.0 3.5 

这些都是你想要什么差不多。你希望他们转移一个,不想要最后一个条目。这很容易做到(如果有点奇怪的话)。

with(dat, by(visit, site, FUN=function(x) c(NA, head(cumsum(x)/1:length(x), -1)))) 
## site: A 
## [1] NA 1.0 1.5 2.0 2.5 3.0 
## ----------------------------------------------------------------------------------------------------- 
## site: B 
## [1] NA 1.0 1.5 2.0 2.5 3.0 

而且可以在一个单一的柱,用unlist容易呈现这些:

dat$mean <- unlist(with(dat, by(visit, site, FUN=function(x) c(NA, head(cumsum(x)/1:length(x), -1))))) 
dat 
## visit site mean 
## 1  1 A NA 
## 2  2 A 1.0 
## 3  3 A 1.5 
## 4  4 A 2.0 
## 5  5 A 2.5 
## 6  6 A 3.0 
## 7  1 B NA 
## 8  2 B 1.0 
## 9  3 B 1.5 
## 10  4 B 2.0 
## 11  5 B 2.5 
## 12  6 B 3.0