2016-03-25 56 views
0

我一直在尋找的答案,這一段時間沒有多少運氣這麼祈禱有人能幫助我!有條件的最大/最小值中的R

我正在處理週期性數據,我試圖找到兩個峯值和兩個谷值的關聯值 - 這不一定等於最大/最小值和第二最大值/最小值,而是最大值/最小值然後第二個最大/最小值取決於該值大於/小於前一值和後續值。

這是一個週期的一個例子

x <- c(3.049, 3.492, 3.503, 3.429, 3.013, 2.881, 2.29, 1.785, 1.211, 0.890, 0.859, 0.903, 1.165, 1.634, 2.073, 2.477, 3.162, 3.207, 3.177, 2.742, 2.24, 1.827, 1.358, 1.111, 1.063, 1.098, 1.287, 1.596, 2.169, 2.292) 

我有個循環的1000年所以我用GROUP_BY在dplyr到組的循環,然後希望組內應用條件最大/最小參數。

我將不勝感激任何這方面的建議,

在此先感謝

編輯

因爲我已經在最後一行用下面的功能只是一個輕微的編輯

return(data.frame(Data.value=x, Time=y, Date=z,HHT=peak, LLT=trough)) 

其中x是我上面的原始x,y是時間var,z是日期var。這使我可以對結果做一些額外的計算(我需要的是最小值/最大值以及值本身的時間)。

所以,現在我有一切數據幀我需要的,但它只是一個日期 - 我仍然無法使用GROUP_BY功能貫穿整個數據集得到這個運行。我一直在使用

subsets<-split(data, data$datevar, drop=TRUE)

試圖按日期分的設置,但仍然需要一種方式以某種方式運行的每個子集findminmax函數(代碼我一些額外的線路)。有任何想法嗎?

回答

0

考慮您可以在dplyr group_by()過程傳遞以下自定義功能。實質上,函數遍歷循環值列表並比較其前後的鄰居。峯值的鄰居都比自己低,鄰居的鄰居大於自己。

findminmax <- function(x){ 
    peak <- list(NA, NA)        # INITIALIZE TEMP LISTS AND ITERATORS 
    p <- 1 
    trough <- list(NA, NA) 
    t <- 1 

    for (i in 1:length(x)){ 
    if (i != 1 & i != length(x)){     # LEAVES OUT FIRST AND LAST VALUES 
     if ((x[i] > x[i-1]) & (x[i] > x[i+1])) {  # COMPARES IF GREATER THAN NEIGHBORS 
     peak[p] <- x[i] 
     p <- p + 1 
     } 
     if ((x[i] < x[i-1]) & (x[i] < x[i+1])){  # COMPARES IF LESS THAN NEIGHBORS 
     trough[t] <- x[i] 
     t <- t + 1 
     } 
    } 
    } 
    return(list(peak1=peak[[1]], peak2=peak[[2]], 
       trough1=trough[[1]], trough2=trough[[2]])) 
} 

result <- findminmax(x) 
#$peak1 
#[1] 3.503  
#$peak2 
#[1] 3.207  
#$trough1 
#[1] 0.859  
#$trough2 
#[1] 1.063 

對於dplyr的GROUP_BY:

finaldf <- originaldf %>% 
      group_by(z) %>% 
       summarise(Time = mean(y), 
          HHT1 = findminmax(x)$peak1, 
          HHT2 = findminmax(x)$peak2, 
          LLT1 = findminmax(x)$trough1, 
          LLT2 = findminmax(x)$trough2) 
+0

感謝@Parfait這個功能完美地工作,但我還是我有麻煩按日期分組 - 見我的編輯以上 – suuz

+0

查看更新的問題。挑戰是你不能從函數返回數據幀,而是標量值。參見修改後的list()返回。 – Parfait

+0

我有了這個對試驗數據的工作,但我一旦應用到整個數據集時得到「錯誤:下標越界」任何想法?我刪除從數據幀包含的NA行,但它可能是有在給定日期3個波峯/波谷或只有1峯/谷或許這是造成問題的情況下? – suuz