J'ai une trame de données, où chaque lignes représentent des données pour une catégorie spécifique à un jour spécifique:Variables d'échelle sur une fenêtre de date de déplacement dans R: le script fonctionne, mais d'une manière inacceptable. Façons d'optimiser?
set.seed(1)
k <- 10
df <- data.frame(
name = c(rep('a',k), rep('b',k)),
date = rep(seq(as.Date('2017-01-01'),as.Date('2017-01-01')+k-1, 'days'),2),
x = runif(2*k,1,20),
y = runif(2*k,100,300)
)
View(df)
Head:
head(df)
name date x y
1 a 2017-01-01 6.044665 286.9410
2 a 2017-01-02 8.070354 142.4285
3 a 2017-01-03 11.884214 230.3348
4 a 2017-01-04 18.255948 125.1110
5 a 2017-01-05 4.831957 153.4441
6 a 2017-01-06 18.069404 177.2228
Structure:
str(df)
'data.frame': 20 obs. of 4 variables:
$ name: Factor w/ 2 levels "a","b": 1 1 1 1 1 1 1 1 1 1 ...
$ date: Date, format: "2017-01-01" "2017-01-02" "2017-01-03" "2017-01-04" ...
$ x : num 6.04 8.07 11.88 18.26 4.83 ...
$ y : num 287 142 230 125 153 ...
J'ai besoin pour mettre à l'échelle les variables x et y de ces données sur une fenêtre de date spécifique. Le script que je suis venu avec est la suivante:
library(dplyr)
library(lubridate)
df2 <- df
moving_window_days <- 4
##Iterate over each row in df
for(i in 1:nrow(df)){
df2[i,] <- df %>%
##Give me only rows for 'name' on the current row
##which are within the date window of interest
filter(date <= date(df[i,"date"]) &
date >= date(df[i,"date"]) - moving_window_days &
name == df[i,"name"]
) %>%
##Now scale x and y on this date wondow
mutate(x = percent_rank(x),
y = percent_rank(y)
) %>%
##Get rid of the rest of the rows - leave only the row we are looking at
filter(date == date(df[i,"date"]))
}
Il fonctionne comme prévu (bien, je voulais d'abord pour obtenir le centile de chaque observation dans une fenêtre mobile, mais mis à l'échelle des valeurs fonctionnera très bien) Le problème est que l'ensemble de données réel est beaucoup plus grand:
'name'
colonne a 30 bureaux locaux'date'
est au moins une valeur d'année de données pour chaque branche- au lieu de
'x'
et'y'
je 6 variables - la fenêtre mobile est de 90 jours
Je courais ce script sur les données réelles, et de 30 000 lignes elle a pu passer seulement 5,000 en 4 heures ... C'est la première fois que je rencontre un problème comme celui-ci.
Je suis sûr que mon script est très inefficace (je suis sûr parce que je ne suis pas un pro dans R. Je suppose que il y a toujours une meilleure façon)
De toute façon ce script peut être optimisé/amélioré?
- Une manière de 'purrrify' (utiliser certaines des fonctions
map
purrr
)? - Image imbriquée?
nest()
? Pensant que c'est une solution ... Je ne sais pas comment mettre en œuvre ...
Tout ce que je peux faire pour lutter contre le problème peut-être d'une manière différente?
Ceci est plus d'un sujet pour https://codereview.stackexchange.com/ – Odysseus210
Donc vous voulez calculer le percentile pour chaque observation, basé sur le courant et les quatre périodes précédentes? – Mako212
@ Odysseus210 peut-être que vous avez raison, mais R n'est pas beaucoup passé en revue là-bas ... Et je sais que beaucoup de questions R sont répondues ici. – Taraas