2014-05-07 109 views
1

我有一個數據集,由1列測量值和1列感興趣列標記事件組成。我想計算每個「事件」後兩次測量的平均值。這樣給定的採樣數據集:根據第二列中的標記計算平均值R

Data<-c(1,2,3,2,3,4,8,4,2,9,2,2,3,2,3,4,5,4,3,3,2,2,2,2,3) 
Event<-c(0,0,0,0,0,"Event",0,0,"Event",0,0,0,"Event",0,0,0,0,"Event",0,0,"Event",0,0,0,0) 

DF<-data.frame(Data,Event) 


    Data Event 
1  1  0 
2  2  0 
3  3  0 
4  2  0 
5  3  0 
6  4 Event 
7  8  0 
8  4  0 
9  2 Event 
10 9  0 
11 2  0 
12 2  0 

隨着第6行的事件時,我會希望calulate行的平均值7-8(平均8和4)。第9行的下一個事件,所以第10-11行的平均值(平均值爲9和2)等等。

我的實際數據是一個csv,在事件列中有空白而不是零,但我無法弄清楚如何設置空白行的DF。

回答

1

此策略涉及發現,有一個「事件」行的索引,然後使用mapply從DF提取矢量兩個值的情況下並採取意思。最後,我將平均值與原始事件索引結合起來,以便知道它來自哪裏。

eventsat <- which(DF$Event=="Event") 
eventmeans <- mapply(function(a,b) mean(DF$Data[a:b]), eventsat+1, eventsat+2) 
cbind(eventsat, means) 

不可否認的mapply可能是矯枉過正,因爲這將允許2以外長度的載體,但如果總是二,它可能只是作爲容易做到

eventmeans <- with(DF, (Data[eventsat+1]+Data[eventsat+2])/2) 
4

這是一個快速和骯髒的方式:

events <- which(DF$Event=="Event") 
sapply(events,function(i)mean(DF[(i+1):(i+2),]$Data)) 
# [1] 6.0 5.5 2.5 3.0 2.0