Подсчитайте следующие n строк, которые удовлетворяют условию в R
Допустим, у меня есть DF, который выглядит так
ID X_Value
1 40
2 13
3 75
4 83
5 64
6 43
7 74
8 45
9 54
10 84
Поэтому я хотел бы сделать функцию прокрутки, которая, если в фактических и последних 4 строках есть 2 или более значений, превышающих X (скажем, 70 для этого примера), затем возвращает 1, иначе 0.
Таким образом, результат будет примерно таким:
ID X_Value Next_4_2
1 40 0
2 13 0
3 75 0
4 83 1
5 64 1
6 43 1
7 24 1
8 45 0
9 74 0
10 84 1
Я думаю, что это было бы возможно с функцией прокрутки, но я пытался и не уверен, как это сделать. заранее спасибо
2 ответа
Учитывая ожидаемый результат, я полагаю, вы имели в виду "в фактических и предыдущих 3 строках". Тогда использование некоторой функции прокрутки действительно делает свою работу:
library(zoo)
thr1 <- 70
thr2 <- 2
last <- 3 + 1
df$Next_4_2 <- 1 * (rollsum(df$X_Value > thr1, last, align = "right", fill = 0) >= thr2)
df
# ID X_Value Next_4_2
# 1 1 40 0
# 2 2 13 0
# 3 3 75 0
# 4 4 83 1
# 5 5 64 1
# 6 6 43 1
# 7 7 74 1
# 8 8 45 0
# 9 9 54 0
# 10 10 84 1
Индексация с использованием max(1,i-3)
пожалуй, единственная часть кода, которую стоит запомнить. Я мог бы помочь в последующем построении, когда цикл for был действительно необходим.
dat$X_Next_4_2 <- integer( length(dat$X_Value) )
dat$ X_Next_4_2[1]=0
for (i in 2:length(dat$X_Value) ){
dat$ X_Next_4_2[i]=
( sum(dat$X_Value[i: (max(0, i-4) )] >=70) >=2 )}
(Не очень симпатичный и явно уступающий уже опубликованному ответу на роллсум.)