Я пытаюсь создать код, который делает следующее: когда значение z больше 2 (порог), затем присваивает значение 1 ДО ТОГО, как значение z пересекает ноль, а когда значение z меньше -2 (a порог), затем присваивайте значение -1, пока z не пересечет ноль, иначе дают нули. Это небольшой пример, но, конечно, мне не нужен такой результат.

z<-c(1, 1.5, 1.3, 2.2, 2.4, 3, 2.2, 1.3, 1, 0.5, 0.2, -.03,
     -1, 0.3, -1.3, -2.3, -3, -1, 0.3, 0, 1, -1)
ifelse(z>2,1,ifelse(z<(-2),(-1),0))
# the result is:
[1]  0  0  0  1  1  1  1  0  0  0  0  0  0  0  0 -1 -1  0  0  0  0  0
# But: I want the result like this
[1]  0  0  0  1  1  1  1  1  1  1  1  0  0  0  0 -1 -1 -1  0  0  0  0

Другой пример:

z<-c(0.5, 1, 1.5, 2.2, 2.3, 3, 3.4, 1.5, 0.5, 1, 1.3, -0.5, 0.3, 
     1, -1, -2.2, -2.3, -1, 0.5, 1, -0.5, -1)

Я хочу такой результат

[1] 0  0  0  1  1  1  1  1  1  1  1  0  0  0  0 -1 -1 -1  0  0  0  0

Кстати, данные, которые я использую, находятся в формате XTS, если это помогает. заранее спасибо

0
hisham saad 25 Сен 2020 в 03:52

1 ответ

Лучший ответ

Теперь это должно делать то, что вы хотите.

library(dplyr)
library(tidyr)
z <- c(1, 1.5, 1.3, 2.2, 2.4, 3, 2.2, 1.3, 1, 0.5, 0.2, -.03, -1, 0.3, 
       -1.3, -2.3, -3, -1, 0.3, 0,1, -1)
z <- data.frame(z) # Convert z into data.frame
z %>% 
  mutate(result = case_when(z > 2 ~ 1,    # assign 1 if z > 2
                            z < -2 ~ -1,  # assign -1 if z < -2
                            z == 0 ~ 0,   # assign 0 if z == 0
                            sign(z) != sign(lag(z)) ~ 0,  # assign 0 if z switches signs
                            TRUE ~ NA_real_)) %>%   # assign NA in all other cases
  fill(result, .direction = "down") %>%   # fill NA values based on the last non-NA above
  replace_na(list(result = 0)) # convert leading NA values to 0

       z result
1   1.00      0
2   1.50      0
3   1.30      0
4   2.20      1
5   2.40      1
6   3.00      1
7   2.20      1
8   1.30      1
9   1.00      1
10  0.50      1
11  0.20      1
12 -0.03      0
13 -1.00      0
14  0.30      0
15 -1.30      0
16 -2.30     -1
17 -3.00     -1
18 -1.00     -1
19  0.30      0
20  0.00      0
21  1.00      0
22 -1.00      0

Столбец результатов соответствует желаемому результату для первого примера z.

Вот результат вашего второго примера z.

      z result
1   0.5      0
2   1.0      0
3   1.5      0
4   2.2      1
5   2.3      1
6   3.0      1
7   3.4      1
8   1.5      1
9   0.5      1
10  1.0      1
11  1.3      1
12 -0.5      0
13  0.3      0
14  1.0      0
15 -1.0      0
16 -2.2     -1
17 -2.3     -1
18 -1.0     -1
19  0.5      0
20  1.0      0
21 -0.5      0
22 -1.0      0
0
Ben Norris 25 Сен 2020 в 13:09