x<-c("A","B")
y<-c(1:10)
dat<-expand.grid(visit=y,site=x)
我想获得一个列,该列具有访问每个站点中前面行的平均值。第一次访问没有价值。
返回数据的示例
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 :(得分:1)
使用y = 1:6
来匹配问题中的示例。
您可以使用by
和cumsum
获取移动平均线:
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