Подсчитайте следующие 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 )}

(Не очень симпатичный и явно уступающий уже опубликованному ответу на роллсум.)

Другие вопросы по тегам