2014-05-05 45 views
-2

我的示例數據集,看起來像這樣:使用信號尖峯來劃分數據中的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 

隨着第一穗是何(4) - 跟以下5個號碼(12,11,12,12,14)的平均值爲12.1

數據中的下一個尖峯是數據點Ho(13,14)(25,25),後面是一組5個數字(12,11,13,12,11),平均值爲11.8 。

依此類推。

+1

是你張貼的輸出數據的一個完整的例子嗎?你能解釋你是如何得到12.2,11.8,12.4,12.2和12.6的值的嗎? – josliber

+0

@josilber - 第一個尖端是'Ho [1]','平均(Ho [2:6])'是'12.2'等。我假設這個關係適用於其他值。 – thelatemail

+0

另外,你定義一個尖峯作爲一個比前一個點多或少40%的數字,但是你會說「尖峯可以持續多達4個數據點」。那麼你怎麼定義跑步?什麼啓動和停止它?你只給出了一個元素明智的定義,所以我沒有看到任何數據運行。 – MrFlick

回答

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

2

看起來好像你實際上定義了一個尖峯,意味着與數據集中的「中等」值不同,而不是與之前的值不同。我已經通過將峯值定義爲高於或低於中值的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