2014-02-16 41 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