2011-12-29 2 views
32

У меня есть набор данных о ценах акций, которые уже округлены до двух знаков после запятой (1234.56). Теперь я пытаюсь округлить до определенного значения, которое отличается для каждого запаса. Вот несколько примеров:R раунд до ближайшей .5 или .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 
    ...        ...      ... 

Я не уверен, как это сделать, но я открыт для предложений.

ответ

50

Возможно,

round(a/b)*b 

будет делать свою работу.

> 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' в пакете' plyr' - хорошая функция, реализующая этот самый алгоритм. Он также принимает дополнительный аргумент 'f', с вариантами« круглый »,« потолок »или« пол ». –

+0

Красиво сделано. Большое спасибо! – screechOwl

+0

@ JoshO'Brien - Вы должны сделать это отдельным ответом, так как люди часто не смотрят в комментарии –

7

Пакет taRifx имеет именно такую ​​функцию:

> 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 

В вашем случае, просто покормить его цена акций и минимальный клеща прирост в качестве первого и второго аргументов, и он должен работать свое волшебство.

N.B. Это теперь устарело. См. Комментарий.

+0

должен '0,36' для тиков' 0,1' '' 0,4'? – kohske

+1

Я думаю, что округление 0,36 с точностью до 0,1 приращения должно привести к 0,4. –

+1

Хорошая точка. Используемый алгоритм неловко свернут по сравнению с решением kohske: frac = vec/roundvec; retvec = vec - (frac - floor (frac)) * roundvec. Учитывая, что эта функциональность уже существует в plyr, я, скорее всего, буду осуждать округлые и указывать людей на round_any. –

10

Я не знаком с языком R, но мой метод должен работать на любом языке с функцией потолка. Я предполагаю, что он округлен до ближайшего 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

Функция в R называется 'потолком' –

+2

Возможно, лучше написать' a = потолок (a/0.5) * 0.5', так как 'a * 2' = 'a/0.5' и' x/2' = 'x * 0.5' –

+0

Кроме того, вы можете заменить' потолок' 'наполом' в этом коде, округляя до ближайшего 0.5. – coip

 Смежные вопросы

  • Нет связанных вопросов^_^