打印1低于特定值,直到达到更高的值

时间:2018-01-22 06:50:56

标签: r loops dplyr

我有数据,我希望在低于某个值时打印1,直到我们达到更高的值。

以此数据为例:

        data long_entry long_exit
1  80.000000          0         1
2   7.692308          1         0
3   7.692308          1         0
4   8.333333          1         0
5   9.090909          1         0
6  20.000000          1         0
7  27.272727          0         0
8  50.000000          0         0
9  50.000000          0         0
10 21.428571          1         0
11 58.333333          0         0
12 46.666667          0         0
13 78.064516          0         1
14 86.153846          0         1
15 42.857143          0         0
16 44.186047          0         0
17 20.000000          1         0
18 25.000000          0         0
19 40.000000          0         0
20 45.000000          0         0
21 78.000000          0         1
22 55.000000          0         0

我的目标是在数据列低于25时打印1,并继续打印1,直到我们遇到超过70的数据(第一个实例)。

用于发出长/退出信号的代码:

df$long_entry = ifelse(df$data < 25,1,0 )  
df$long_exit = ifelse(df$data >= 70,1,0)

我尝试使用base和dplyr编写一些for循环:

  df$final.signal[[1]] = ifelse(df$long_entry[[1]] == 1, 1, 0)

  for (i in 2:nrow(df)){
    df$final.signal[i] = ifelse(df$long_entry[i] ==1, 1, 0,
                          ifelse(df$long_exit[i] == 1, 0,
                                 df$long_exit[i-1]))
  }

  df <- df %>%
    dplyr::mutate(final.signal = ifelse(long_entry == 1, 1,
                                    ifelse(long_exit ==1, 0, 0)))

然而,这并没有按预期进行。所需的输出是这样的:

        data desired.output
1  80.000000              0
2   7.692308              1
3   7.692308              1
4   8.333333              1
5   9.090909              1
6  20.000000              1
7  27.272727              1
8  50.000000              1
9  50.000000              1
10 21.428571              1
11 58.333333              1
12 46.666667              1
13 78.064516              1  (1 on first instance over 70)
14 86.153846              0
15 42.857143              0
16 44.186047              0
17 20.000000              1 (back to 1 when under 25)
18 25.000000              1
19 40.000000              1
20 45.000000              1
21 78.000000              1 ( stay 1 until first instance over 70)
22 85.000000              0

我们看到我们打印1&lt;直到我们遇到&gt; 70的第一个实例。

哪个是接近此任务的最佳方法?

1 个答案:

答案 0 :(得分:1)

这可以帮到你:

dataa <- data.frame(abs(rnorm(mean = 30, sd = 40, n= 100)))
names(dataa) <- c("v1")
dataa %>% mutate(v2 = as.numeric( (cumsum(as.numeric(dataa$v1>70)) <= 0) & (cumsum(as.numeric(dataa$v1<25)) >= 1)))