2014-05-07 105 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