J'ai un ensemble de données sur les cours des actions qui ont déjà été arrondis à 2 décimales (1234.56)
. J'essaie maintenant d'arrondir à une valeur spécifique qui est différente pour chaque stock. Voici quelques exemples:
Current Stock Price Minimum Tick Increment Desired Output
123.45 .50 123.50
155.03 .10 155.00
138.24 .50 138.00
129.94 .10 129.90
... ... ...
Je ne sais pas vraiment comment procéder, mais je suis ouvert aux suggestions.
Probablement,
round(a/b)*b
fera le travail.
> a <- seq(.1,1,.13)
> b <- c(.1,.1,.1,.2,.3,.3,.7)
> data.frame(a, b, out = round(a/b)*b)
a b out
1 0.10 0.1 0.1
2 0.23 0.1 0.2
3 0.36 0.1 0.4
4 0.49 0.2 0.4
5 0.62 0.3 0.6
6 0.75 0.3 0.6
7 0.88 0.7 0.7
Je ne connais pas le langage R, mais ma méthode devrait fonctionner avec n'importe quel langage avec une fonction de plafond. Je suppose qu'il est arrondi à 0,5 près:
a = ceiling(a*2) / 2
if a = 0.4, a = ceiling(0.4*2)/2 = ceiling(0.8)/2 = 1/2 = 0.5
if a = 0.9, a = ceiling(0.9*2)/2 = ceiling(1.8)/2 = 2/2 = 1
Le package taRifx a juste une telle fonction:
> library(taRifx)
> roundnear( seq(.1,1,.13), c(.1,.1,.1,.2,.3,.3,.7) )
[1] 0.1 0.2 0.3 0.4 0.6 0.6 0.7
Dans votre cas, il suffit de lui donner le prix de l'action et l'incrément de tick minimum comme premier et deuxième arguments, et cela devrait fonctionner sa magie.
N.B. Ceci est maintenant obsolète. Voir commentaire.
Comme ce que JoshO'Brien a dit dans les commentaires: round_any
dans le package plyr
fonctionne très bien!
> library(plyr)
> stocks <- c(123.45, 155.03, 138.24, 129.94)
> round_any(stocks,0.1)
[1] 123.4 155.0 138.2 129.9
>
> round_any(stocks,0.5)
[1] 123.5 155.0 138.0 130.0
>
> round_any(stocks,0.1,f = ceiling)
[1] 123.5 155.1 138.3 130.0
>
> round_any(stocks,0.5,f = floor)
[1] 123.0 155.0 138.0 129.5
En savoir plus ici: https://www.rdocumentation.org/packages/plyr/versions/1.8.4/topics/round_any