54 votes

R arrondir à 0,5 ou 0,1 le plus proche

Je dispose d'un ensemble de données sur les cours des actions qui ont déjà été arrondis à la deuxième décimale. (1234.56) . J'essaie maintenant d'arrondir à une valeur spécifique qui est différente pour chaque action. 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 à toute suggestion.

83voto

kohske Points 30437

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

17voto

ledmirage Points 41

Je ne connais pas le langage R, mais ma méthode devrait fonctionner avec n'importe quel langage disposant d'une fonction plafond. Je suppose que l'on arrondit à 0,5 le plus proche :

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

9voto

winanonanona Points 116

Comme ce qu'a dit JoshO'Brien dans les commentaires : round_any dans le paquet 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

Plus d'informations ici : https://www.rdocumentation.org/packages/plyr/versions/1.8.4/topics/round_any

6voto

Ari B. Friedman Points 24940

Le paquet taRifx a justement cette 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 fournir le cours de l'action et l'incrément minimum de tic-tac comme premier et deuxième arguments, et il devrait faire son travail.

N.B. Cette fonction est désormais obsolète. Voir le commentaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X