我有数据,我希望在低于某个值时打印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的第一个实例。
哪个是接近此任务的最佳方法?
答案 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)))