web-dev-qa-db-fra.com

R arrondi au 0,5 ou 0,1 le plus proche

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.

39
screechOwl

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
65
kohske

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
14
ledmirage

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.

7
Ari B. Friedman

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

1
wwijaya001