Рассчитать максимум прошлогодних наблюдений

Я изо всех сил пытаюсь получить максимальное значение переменной за последний год наблюдений (не каждый год!) И реализовать его для каждой строки (наблюдение).

Я думаю, что лучший способ сделать это - использовать функцию rollapply, но я не могу понять, как должна выглядеть ширина, поскольку она может различаться для каждого наблюдения (каждое наблюдение представляет день, но не во все дни есть наблюдения). Я знаю, что использование списка приведет к значениям смещения, так как же эти значения должны выглядеть?

Код, который я получил:

mutate(data,"Feature"=rollapplyr(variable,list(0,"Go back one year"),max,fill=NA))

Пример для пояснения: в строке указана дата 31.08.2016. Я хочу, чтобы новый столбец (с использованием пакета mutate dplyr) отображал в этой строке максимальное значение variable с 31/8/2015 по 31/8/2016 (эта строка).

Для тех, кто хочет пойти дальше: вместо отображения значения variable отображайте TRUE или FALSE (или 1 / 0), когда рассчитанный максимум variable превышает пороговое значение.


person Yoni W    schedule 21.10.2017    source источник
comment
Более вероятно, что вы получите хороший ответ, если предоставите полный минимально воспроизводимый пример вместе со своим вопросом. Что-то, из чего мы можем работать и использовать, чтобы показать вам, как можно было бы ответить на ваш вопрос. Это также делает ваш вопрос и ответ более полезными для других в будущем.   -  person Eric Fail    schedule 21.10.2017


Ответы (1)


Без дальнейших подробностей затрудняюсь ответить. Но посмотрите, нужно ли вам это:

data=data.frame(Data=seq.Date(as.Date("2001-01-01"),as.Date("2005-12-31"),by = "month"),Var=sample(1:1000,60,TRUE))
#exclude some lines
data=data[-c(10,15,17:21),]


 # using for
    for (i  in 1:nrow(data)){ # i=1
      data$Max[i]=max(data[data$Data>(data$Data[i]-360) & data$Data<=data$Data[i],"Var"])
    }


# using rollapply
 # one year interval from dates   
    for (i  in 1:nrow(data)){ # i=1
      data$Oneyear[i]=length(data$Data[data$Data>(data$Data[i]-360) & data$Data<=data$Data[i]])
    }  

data$Maxr=rollapplyr(data$Var, data$Oneyear, max)

С использованием

set.seed(123)

ты получишь:

> tail(data)
         Data Var Oneyear Max Maxr
55 2005-07-01 561      12 858  858
56 2005-08-01 207      12 858  858
57 2005-09-01 128      12 858  858
58 2005-10-01 754      12 858  858
59 2005-11-01 896      12 896  896
60 2005-12-01 375      12 896  896
person Robert    schedule 21.10.2017
comment
Спасибо, @Robert! было очень полезно! Я видел, что вы использовали 360 дней в качестве года. Можно ли заменить это на полный год в зависимости от даты наблюдения? (Под полным годом я подразумеваю минус 1 в году даты, в то время как день и месяц остаются прежними. - person Yoni W; 21.10.2017
comment
да. Вместо (data$Data[i]-360) используйте as.Date(paste(as.numeric(format(data$Data[i],"%Y"))-1,format(data$Data[i],"%m-%d"),sep="-")) - person Robert; 21.10.2017