2011-12-29 33 views
32

Tengo un conjunto de datos de precios de acciones que ya se han redondeado a 2 decimales (1234.56). Ahora estoy tratando de redondear a un valor específico que es diferente para cada acción. Aquí hay algunos ejemplos:R redondear a .5 o .1

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 
    ...        ...      ... 

No estoy muy seguro de cómo hacerlo, pero estoy abierto a sugerencias.

Respuesta

50

Probablemente,

round(a/b)*b 

va a hacer el trabajo.

> 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 
+20

FWIW, 'round_any' en el paquete' plyr' es una buena función que implementa este mismo algoritmo. También toma un argumento adicional 'f', con las opciones' "round" ',' "ceiling" ', o' "floor" '. –

+0

Bien hecho. ¡Muchas gracias! – screechOwl

+0

@ JoshO'Brien - Debe hacer que esta sea una respuesta separada, ya que las personas a menudo no miran en los comentarios –

7

El paquete taRifx tiene sólo una función de este tipo:

> 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 

En su caso, simplemente alimentar el precio de las acciones y el incremento del precio mínimo ya que sus argumentos primero y segundo, y debería funcionar su magia.

N.B. Esto ahora ha sido desaprobado. Ver comentario.

+0

debe '0.36' para las marcas' 0.1' be '0.4'? – kohske

+1

Creo que al redondear 0.36 al incremento 0.1 más cercano debería llevar a 0.4. –

+1

Buen punto. El algoritmo utilizado es vergonzosamente intrincado en comparación con la solución de kohske: frac = vec/roundvec; retvec = vec - (frac - piso (frac)) * roundvec. Dado que esta funcionalidad ya existe en plyr, probablemente desaprobaré a las personas de roundnear y de punto hacia round_any. –

10

No estoy familiarizado con R el idioma, pero mi método debería funcionar con cualquier idioma con una función de techo. Supongo que se redondea a la siguiente 0.5:

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 
+1

La función en R se llama 'techo ' –

+2

Tal vez sea mejor escribir' a = techo (a/0.5) * 0.5' ya que 'a * 2' = 'a/0.5' y' x/2' = 'x * 0.5' –

+0

Además, puede reemplazar' techo' con 'piso' en este código para redondear al 0.5 más cercano. – coip

Cuestiones relacionadas