我有一个数据集,包括1列测量值和1列标记感兴趣的事件。我想在每个"事件"之后计算两次测量的平均值。所以给出一个样本数据集:
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行中的事件,我想要计算第7-8行的平均值(平均值为8和4)。第9行的下一个事件,行10-11的平均值(9和2的平均值),依此类推。
我的实际数据是在事件列中使用空格而不是零的csv,但我无法弄清楚如何设置空白行的DF。
答案 0 :(得分: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
答案 1 :(得分: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)