设置循环行程max'n'行

时间:2017-08-13 20:37:01

标签: r

好的

所以我有一个循环,当前找到一个低于< -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

我打算做的不是退出循环&gt; 1,而是在固定数量的'n'行之后退出。 因此,如果我将总循环行程设置为从初始-1找到的5行,它将在其行进最大nlines为5之后打印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

注意每个&lt; -1.0值我们打印1并且行5行...同样在第9行,我们有一个重复&lt; 1.0而最大5 nlines条件没有得到满足,这忽略了重复在最大'n'行程内。

再次第17行我们遇到&lt; -1.0并打印1行,最多行程为5行。

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)
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

不知道反制解决方案。似乎很复杂。

编辑:您可能需要这样做:

 res <- res[1:length(value)]
转换为数据框之前

。这可确保您的信号列不长于观察/值列。