使用信号尖峰来划分R中的数据集

时间:2014-05-05 01:55:53

标签: r

我有一个如下所示的示例数据集:

Ho<-c(12,12,12,24,12,11,12,12,14,12,11,13,25,25,12,11,13,12,11,11,12,14,12,2,2,2,11,12,13,14,12,11,12,3,2,2,2,3,2,2,1,14,12,11,13,11,12,13,12,11,12,12,12,2,2,2,12,12,12,12,15)

这个数据集中有正负峰值,我想用它作为标记来计算数据中的均值。我会将尖峰的开始定义为任何比之前的数字大40%或更少的数字。当尖峰跳回超过40%时,尖峰结束。因此,理想情况下,我希望在数据集中找到每个尖峰,并在最后一个尖峰数之后立即取5个数据点的平均值。

可以看出,尖峰可以持续长达5个数据点。我希望遵循的平均规则是:

在最后记录的尖峰数据点之后开始平均,而不是在第一个尖峰数据点之后。因此,如果峰值持续三个数据点,则在第三个加标数据点之后开始平均。

所以理想的输出看起来像这样:

 1= 12.2
 2= 11.8
 3= 12.4
 4= 12.2
 5= 12.6

第一个加标是Ho(4) - 接下来是5个数字(12,11,12,12,14),平均值为12.1

数据的下一个峰值是数据点Ho(13,14)(25,25),然后是5个数字(12,11,13,12,11)的平均值为11.8。

等等其余的序列。

2 个答案:

答案 0 :(得分:2)

有点似乎你实际上定义的尖峰意味着不同于&#34;媒体&#34;数据集中的值,而不是与先前值不同。我通过将峰值定义为高于或低于中值的40%(对于发布的样本数据为12)来实现此操作。然后你可以使用漂亮的rle函数来获得平均值:

r <- rle(Ho >= mean(Ho)*0.6 & Ho <= median(Ho)*1.4)
run.begin <- cumsum(r$lengths)[r$values] - r$lengths[r$values] + 1
run.end <- run.begin + pmin(4, r$lengths[r$values]-1)
apply(cbind(run.begin, run.end), 1, function(x) mean(Ho[x[1]:x[2]]))
# [1] 12.2 11.8 12.4 12.2 12.6

答案 1 :(得分:1)

所以这里的代码似乎与你的结果相同。

#Data
Ho<-c(12,12,12,24,12,11,12,12,14,12,11,13,25,25,12,11,13,12,11,11,12,14,12,2,2,2,11,12,13,14,12,11,12,3,2,2,2,3,2,2,1,14,12,11,13,11,12,13,12,11,12,12,12,2,2,2,12,12,12,12,15)
#plot(seq_along(Ho), Ho)

#find changes
diffs<-tail(Ho,-1)/head(Ho,-1)
idxs<-which(diffs>1.4 | diffs<.6)+1

starts<-idxs[seq(2, length(idxs), by=2)]
ends<-ifelse(starts+4<=length(Ho), starts+4, length(Ho))

#find means
mapply(function(a,b) mean(Ho[a:b]), starts, ends)

Sample Data