Скользящее среднее геометрическое в data.table vs dplyr - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь вычислить среднее геометрическое и 90-й процентиль для скользящих 90-дневных окон для каждого идентификатора группы.Он работает в data.table, но не в dplyr, который мне удобнее.DT_new - это то, как должен выглядеть вывод.Также tibbletime, zoo-rollapply и tbrf все были неудачными, следовательно, ручное вращение.

1) Как я могу сделать это в dplyr?

2) В data.table, как я могу изменить код так, чтобы он добавлял новые геометрические средние и квантильные столбцы в одном выражении?

3) Как я могу добавить в таблицу data.table столбец с именем «Группа» для каждого 90-дневного окна?

 geo_mean <- function(data) {
 log_data <- log(data)
 gm <- exp(mean(log_data[is.finite(log_data)]))
 return(gm)
 }
  ###sample data#
 Value=c(50,900,25,25,125,50,25,25,2000,25,25,25,25,25,25,25,25,325,25,300,475,25)
Date = as.Date(c("2015-02-23","2015-04-20","2015-06-17",
    "2015-08-20","2015-10-05","2015-12-22",
    "2016-01-19","2016-03-29","2016-05-03",
    "2016-07-21","2016-09-08","2016-11-07",
    "2017-02-27","2017-04-19","2017-06-29",
    "2017-08-24","2017-10-23","2017-12-28",
    "2018-01-16","2018-03-14","2018-05-29",
    "2018-07-24"))
ID = c(rep("A", 11), rep("B", 11))
df=data.frame(Value,Date,ID) 
require(data.table) 
DT=setDT(df) #####Works with data.table but I have to run it twice#######
  DTnew= DT[, Rollquantile:= { 
d <- DT$Date- Date
quantile(DT$Value[ID == DT$ID & d <= 0 & d >= -90],0.90)
},by = list(Date,ID)]
DT_new= DTnew[, Rollgeomean:= { 
d <- DT$Date- Date
 geo_mean(DT$Value[ID == DT$ID & d <= 0 & d >= -90])
},by = list(Date,ID)]

############ won't work in dplyr########
df_new=df %>% group_by(ID,Date) %>% mutate(d = df$Date- Date, 
Geomean=geo_mean(df$Value[ID == df$ID & d <= 0 & d >= -90]),
Quantile= quantile(df$Value[ID == df$ID & d <= 0 & d >= -90],0.90))

##failed attempt to add "Group"########
paste0("Group_", 1 + c(0, cumsum((c(TRUE, lag(Date.Time) > 90)))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...