Я пытаюсь создать код, который делает следующее: когда значение 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, если это помогает. заранее спасибо
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
Похожие вопросы
Новые вопросы
r
R — это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, используйте минимально воспроизводимые примеры, которые другие могут запустить с помощью копирования и вставки. Показать желаемый результат полностью. Используйте dput() для данных и укажите все небазовые пакеты с помощью library(). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. Для вопросов по статистике используйте https://stats.stackexchange.com.