2011-08-18 102 views
5

私は相対的なROBです。私は負rgdeltas値を識別しようとしている条件付き移動最大

  Tempadjvolt  newmass  rgdeltas 
2794  498.5777 0.5355647187 0.00000000 
2795  499.7577 0.5355647187 0.00000000 
2796  500.7877 0.3415104788 -2.87487763 
2797  502.1177 0.4312854788 -1.54487763 
2798  500.3877 0.5355647187 0.00000000 
2799  502.5377 0.4596354788 -1.12487763 
2800  507.6877 0.8072604788 4.02512237 
2801  505.2577 0.6432354788 1.59512237 
2802  505.7977 0.6796854788 2.13512237 
2803  517.8877 1.4957604788 14.22512237 
2804  502.2477 0.4400604788 -1.41487763 
2805  507.3677 0.7856604788 3.70512237 
2806  519.7277 1.6199604788 16.06512237 
2807  528.9377 2.2416354788 25.27512237 
2808  520.2677 1.6564104788 16.60512237 
2809  519.3877 0.5355647187 0.00000000 
2810  526.5677 2.0816604788 22.90512237 
2811  519.5377 0.5355647187 0.00000000 
2812  526.9277 2.1059604788 23.26512237 
2813  529.9877 2.3125104788 26.32512237 
2814  514.4077 1.2608604788 10.74512237 
2815  518.3777 1.5288354788 14.71512237 

[例えば、行2804]および7位の背後にあると先にし、「見て」:

私はこのようになります大きなデータセットを持っています最も高いTempadjvoltを見つけて、行2804のtempadjvoltをそのローカルmaxに設定します。

フレームの長さは〜4000行です。そのうち〜515は負の値です。私は一生懸命働いたループのためにカップルを試してみました...しかしまた、ナースの束を吐き出す - それは彼らが不十分/不適切に建設されたと思うようになります。

ご協力いただければ幸いです。

コメントに指摘されたとおり、元の投稿は不明でした。私は連続的な負のrgdeltas値について心配していません。フレームの前と終わりの7以内の負の値の場合、理想的には、ループは開始/終了の前に前後に多くの位置を表示するでしょう。この時点でそれほど心配していない。

ちょっとした背景: これは、元々C#で書かれた信号処理プログラムの一部です。環境モニタから出力される多数のファイルのバッチ処理をより簡単にするためにRに移行しようとしています。私は元のコードを書いていませんでしたが、これはずっと大きな一連のものの中の小さなコンポーネントの1つに過ぎません。

私は助けていただきありがとうございます。ありがとう!

+0

私は質問には明確な答えを持っているとは思いません。 2つの負の値が互いに14の位置にある場合、明示的な場合があるため、何が起こるかの解決策を提示していません。 (...または、私が「ベースライン」にリセットするという考え方を誤解しているかもしれません。 –

+0

負の値が最初または最後から7行未満の場合にどうなるべきかを指定していません。 。 – joran

+0

Dwin、joran - ありがとう。私は上記の私のデータの貧弱な表現を掲載した。私は修正しようとしている。私はお互いの間に2つ以上のネガを心配していない。値が最初か最後にあるなら...私は考えなかった。あいまいさについてお詫び申し上げます、1分で私の編集が助けになることを願っています。 –

答えて

4

は、その名前がdatであると仮定します

negidxs <- as.numeric(rownames(dat)[ dat[[3]] < 0 ]) 
for (i in negidxs){ 
     dat[as.character(i), "Tempadjvolt"] <- 
      max(dat[rownames(dat) %in% (i-7):(i+7), "Tempadjvolt"], na.rm=TRUE) } 
dat 
    #----------------------------------# 
    Tempadjvolt newmass rgdeltas 
2794 498.5777 0.5355647 0.000000 
2795 499.7577 0.5355647 0.000000 
2796 517.8877 0.3415105 -2.874878 
2797 517.8877 0.4312855 -1.544878 
2798 500.3877 0.5355647 0.000000 
2799 519.7277 0.4596355 -1.124878 
2800 507.6877 0.8072605 4.025122 
2801 505.2577 0.6432355 1.595122 
2802 505.7977 0.6796855 2.135122 
#snipped----- 
5

1)ゼロを記入してください。幅15の移動ウィンドウに、f、我々は関数を適用するために動物園のパッケージにrollapplyを使用したデータフレームをDFと呼ばれていると仮定すると:

我々はゼロで始まりと終わりの近くのポイントを満たした上記で
library(zoo) 
# columns of DF are (1) Tempadjvolt, (2) newmass and (3) rgdeltas 
f <- function(x) if (x[8, 3] < 0) max(x[, 1]) else x[8, 1] 
DF[[1]] <- rollapply(DF, 15, f, fill = 0, by.column = FALSE) 

これを扱う正確な方法はあまり重要ではないようですが、他の値を使用することもできます。

2)終了値のままにします。別の可能性だけでなく、端部付近のポイントを処理する:

DF[seq(8, nrow(DF)-7), 1] <- rollapply(DF, 15, f, by.column = FALSE) 

3)パーシャル。または、我々はpartial = TRUEを使用して、このような末端近く部分値のmaxを取ることができた:

f2 <- function(x) { 
     # Columns of DF2 are (1) Tempadjvolt, (2) newmass, (3) rgdeltas and (4) seq. 
     # Condition is TRUE if passed a partial x near the beginning. 
     # k is row index of current row in x. Normally 8 but near start it varies. 
     k <- if (x[1, 4] == 1) nrow(x) - 7 else 8 
     if (x[k, 3] < 0) max(x[, 1]) else x[k, 1] 
} 
DF2 <- cbind(DF, seq = 1:nrow(DF)) 
DF[[1]] <- rollapply(DF2, 15, f2, partial = TRUE, by.column = FALSE)