2016-04-01 10 views
0

データセットのピークと谷を検索する必要があるプロジェクトで作業しています(列あたりの数値が高いだけでなく、と谷)。 私はそれを1列で動作させることができましたが、私はfor-loopを使用しています。これを約50列にする必要があるので、私は 'apply'関数を使うべきだと思います。私はちょうどそうする方法を知らない。 'if'文などを 'apply'関数に入れることはできますか?'apply'関数を使用して条件文を使用してコードを実行するR

は、ここで私は一つの列をチェックするために使用したものである: あなたができることを確認

Lowest = 0 
Highest = 0 
Summits = vector('numeric') 
Valleys = vector('numeric') 

for (i in 1:length(First$Seq1)) 
{ 
    if (!is.na(First$Seq1[i+1])) 
    { 
     if (First$Seq1[i] < Lowest) {Lowest = First$Seq1[i]} 
     if (First$Seq1[i] > Highest) {Highest = First$Seq1[i]} 

     if (First$Seq1[i] > 0 && First$Seq1[i+1] < 0) 
     { Summits <- append(Summits, Highest, after=length(Summits)) } 
     if (First$Seq1[i] < 0 && First$Seq1[i+1] > 0) 
     { Valleys <- append(Valleys, Lowest, after=length(Summits)) } 
    } 
} 

答えて

0

(「最初の」データセットの名前と「SEQ1」は、第1の列です)!あなたドンを提供し、

HelperFun <- function(x) { 
    # your code from above, replacing 'Seq1' by x 
    } 
    apply(First, 2, HelperFun) 
+0

xについて質問があります。何が起こるのでしょうか?毎回1ずつ増加していますか? Seq1をxに置き換えるとxが存在しないというエラーが出るので、 –

+0

私は今それを実行している!ありがとう!私が今理解しなければならないのは、結果を保存する最良の方法です。 途中で 'HelperFun'の前に 'function(x)'を追加する必要がありました。他の誰かが知りたいのですか? –

+0

「HelperFun」の前に「function(x)」を追加する必要はありません。だからあなたは、必要ではないはずのことをやったので、おそらく 'apply'の仕組みを完全には理解していないでしょう。 – Roland

0

*apply機能はforループよりも、このためのより良いではありません:私は最初の1つの特定の列をどう処理するかを定義し、適用範囲内、あなたはその関数を呼び出すヘルパー関数を定義しますforループのオブジェクトを作成しないでください。ループ内でappendを決して使用してはいけません。結果オブジェクトを事前に割り当てて記入します。

これは、グリッド上のすべての極小値を見つける:私はその対角線の隣人は、同じ列または行の隣人だけではない隣人としてカウントされているものとしました

#an example 
set.seed(42) 
plane <- matrix(rnorm(100, sd = 5), 10) 

#plot 
library(raster) 
plot(raster(plane)) 

#initialize a logical matrix 
res <- matrix(TRUE, ncol = ncol(plane), nrow = nrow(plane)) 

#check for each subgrid of 2 times 2 cells which of the cells is the minimum 
for (i in 1:(nrow(plane) - 1)) { 
    for (j in 1:(ncol(plane) - 1)) { 
    inds <- as.matrix(expand.grid(r = i + 0:1, c = j + 0:1)) 
    #cell must be a minimum of all 4 subgrids it is part of 
    res[inds] <- res[inds] & plane[inds] == min(plane[inds]) 
    } 
} 

print(res) 
plane[res] 
#[1] -13.282277 -8.906542 -8.585043 -12.071038 -3.919195 -14.965450 -5.215595 -5.498904 -5.971644 -2.380870 -7.296070 

#highlight local minima 
plot(rasterToPolygons(raster(res)), border = t(res), add = TRUE) 

library(reshape2) 
res1 <- melt(res) 
res1 <- res1[res1$value,] 
text(x = res1$Var2 /10 - 0.05, 
    y = 1-res1$Var1 /10 + 0.05, 
    labels = round(plane[res],1)) 

resulting plot

。しかし、これは変更するのは簡単ではありません。

+0

ループの前に出力を定義することに問題があり、出力がどれだけ長くなるかわかりません。 0から非常に高い値までの任意の値にすることができます。私は長さを1000に設定することができます。なぜなら、それは決して多くは得られないからです。しかし、しばしば配列のほとんどを空にします。私はおそらく後で何かを配列を短縮する必要があります...? –

+0

確かに。私の提案は、それぞれの値がローカル最小値かどうかを示す論理行列(私のコードを参照)を返すことです。値自体に興味がある場合は、これを使用して入力行列をサブセット化することができます。 – Roland

+0

私のデータセットは実際にあなたがここに示したものとはかなり異なっています。私は特定の領域内の暗闇のための54個の個別のビデオを分析しました。私は鳥の群れを行き来する暗い波を見ている。だから、私は明るく暗い峰を探しているのです。私はこれらの波がどんなに遠く離れているかは決して決してわかりません。したがって、私は最大値または最小値をどれだけ遠く見なければならないのか分かりません。それはビデオごとに異なります。 –

0

これはあなたが求める解決策ではないことを知っています---あなたは1次元の時系列を持っていますが、ここではRolandのソリューションの(より直接的な)バリエーションです。

#example data 
set.seed(42) 
plane <- matrix(rnorm(100, sd = 5), 10) 
library(raster) 
r <- raster(plane) 

f <- focal(r, matrix(1,3,3), min, pad=TRUE, na.rm=TRUE) 
x <- r == f 
mins <- mask(r, x, maskvalue=FALSE) 

pts <- rasterToPoints(mins) 
cells <- cellFromXY(x, pts) 

r[cells] 

plot(r) 
text(mins, digits=1) 
plot(rasterToPolygons(mins), add=TRUE) 
関連する問題