2012-01-29 3 views
2

Si j'avais une trame de données de 20 valeurs:coulissant cummax dans R

x <- data.frame(runif(20,10,90)) 

Je voulais créer une autre colonne des valeurs maximales cumulées ne dépassant pas les 5 valeurs précédentes comment pourrais-je le faire? Fondamentalement, ce serait une fenêtre glissante des 5 valeurs précédentes. Ci-dessous sont les données de comment un cummax normal serait fait et un cummax coulissant, j'ai indiqué où le changement est apparent.

runif   normal cummax sliding cummax 
1 42.84205   42.84205   42.84205 
2 17.17040   42.84205   42.84205 
3 50.08326   50.08326   50.08326 
4 21.47712   50.08326   50.08326 
5 59.30754   59.30754   59.30754 
6 16.49770   59.30754   59.30754 
7 89.52601   89.52601   89.52601 
8 49.91727   89.52601   89.52601 
9 69.84386   89.52601   89.52601 
10 13.92894   89.52601   89.52601 
11 56.39335   89.52601   89.52601 
**12 28.30264   89.52601   69.84386** 
13 60.09056   89.52601   69.84386 
14 17.79935   89.52601   60.09056 
15 63.53476   89.52601   63.53476 
16 62.98458   89.52601   63.53476 
17 67.21095   89.52601   67.21095 
18 16.01599   89.52601   67.21095 
19 39.99181   89.52601   67.21095 
20 40.96641   89.52601   67.21095 

Répondre

2
> library(TTR) 
> set.seed <- 1234 
> x <- data.frame(runif(20,10,90)) 
> x[[2]] <- runMax(x, n=5) 
> x 
    runif.20..10..90.  V2 
1   79.18671  NA 
2   13.34858  NA 
3   35.37457  NA 
4   11.10000  NA 
5   29.12206 79.18671 
6   66.51957 66.51957 
7   34.64758 66.51957 
8   50.68381 66.51957 
9   14.13173 66.51957 
10   55.16559 66.51957 
11   19.71841 55.16559 
12   81.42691 81.42691 
13   11.17018 81.42691 
14   72.64969 81.42691 
15   17.19691 81.42691 
16   51.53520 81.42691 
17   40.74134 72.64969 
18   15.60420 72.64969 
19   35.65155 51.53520 
20   63.47963 63.47963 
+0

vous pouvez remplacer ces 'NA's par' x [1: 4, 2] <- cummax (x [1: 4, 1]) ' – GSee

3

Vous pourriez probablement faire quelque chose comme ceci:

rollapplyr(x,5,max,partial = TRUE,by.column = FALSE) 

du paquet zoo. (Je ne pas utiliser ce paquet régulièrement, donc je ne sais pas pourquoi je besoin de préciser by.column = FALSE pour faire en sorte que le peut-être quelqu'un d'autre peut commenter l'argument partial a travaillé comme je m'y attendais. Ce ...)

+0

C'est un bug. En rencontrant 'max', il essaie d'utiliser' rollmax' pour accélérer le calcul, mais 'rollmax' ne supporte pas' partial'. ('rollmax' ne supporte pas' by.column' mais il le sait donc en ajoutant 'by.column' il n'a pas essayé d'utiliser' rollmax'.) Cela éviterait le bug: 'rollapplyr (x, 5, (max), partial = VRAI) '. Aussi cela fonctionne si c'est correct d'insérer NA au début et est plus rapide: 'rollmax (x, 5, remplir = NA, align =" right ")'. –