2017-08-13 6 views
0

[OK]を設定ループ旅行最大「n」の行

だから私は現在、< -1未満の値を検索し、1それ以外は0を出力しますループを持って

それ意志、ループ、それは別の値が見つかるまで> = 1

value <- c(0.2,0.3,0.4,0.5,0.6,-2.0,0.7,0.4,-10,0.1,0.2,0.4,3.0,0.6,0.7,0.8,-1.2,0.6,0.7,0.8,0.3,0.5,2,0.1,0.2) 
df <- data.frame(signal =0,value) 

df$signal[[1]] = ifelse(df$value[[1]] < (-1), 1, 0) 

for (i in 2:nrow(df)){ 
    df$signal[i] = ifelse(df$value[i] < (-1), 1, 
         ifelse(df$value[i] >= 1, 0, 
           df$signal[i-1])) 
} 
df 

私は何をしようとする代わりに、> 1ループを出ると、「n」個の行一定数の後に終了されます。 したがって、最初の-1の検索から5行までの合計ループ旅行を設定すると、5の最大nlinesを移動した後に0が表示されます。

5行以内の別の信号1を満たすと、これを無視して5行の旅行に進むだけです。カウンターの設定の線に沿って

イム思考:しかし、それは私の結果を生成しませ合理的

counter <- 1 
repeat { 
    df$signal = ifelse(df$value < (-1), 1, 0) 
    counter <- counter+1 

    if(counter > 5) { 
    break 
    } 
} 

上記の縫い目。

誰でもこれに関するアイデアはありますか?

所望の出力は次のようになります。

signal value 
1  0 0.2 
2  0 0.3 
3  0 0.4 
4  0 0.5 
5  0 0.6 
6  1 -2.0 
7  1 0.7 
8  1 0.4 
9  1 -10.0 
10  1 0.1 
11  0 0.2 
12  0 0.4 
13  0 3.0 
14  0 0.6 
15  0 0.7 
16  0 0.8 
17  1 -1.2 
18  1 0.6 
19  1 0.7 
20  1 0.8 
21  1 0.3 
22  0 0.5 
23  0 2.0 
24  0 0.1 
25  0 0.2 

お知らせも...我々は1を印刷し、5行のために旅行する各< -1.0値に9行目に、我々は最大5ながら繰り返し< 1.0を持っていますnlines条件が満たされていない場合、これは最大 'n'行の旅行内の繰り返しを無視します。

私たちは< -1.0を満たし、5行の最大旅行のために1を印刷します。

答えて

1

これはあなたのために働く必要があります。

value <-c(0.2,0.3,0.4,0.5,0.6,-2.0,0.7,0.4,-10,0.1,0.2,0.4,3.0,0.6,0.7,0.8,-1.2,0.6,0.7,0.8,0.3,0.5,2,0.1,0.2) 
res <- NULL 
while (length(res) < length(value)) { 
    if (value[length(res)+1] < -1) { 
     res <- c(res, rep(1,5)) 
    } else { 
     res <- c(res, 0) 
    } 
} 
res <- data.frame(signal = res, value = value) 
res 

はカウンターソリューションを知ってはいけません。複雑に見えます。

EDIT:あなたは何をする必要がある場合があります。

res <- res[1:length(value)] 

あなたがデータフレームに変換する前に。これにより、信号列が観測/値列より長くならないようにします。

+0

素晴らしい - 素晴らしい作品です - ありがとうございます! –

関連する問題