Подтвердить что ты не робот

R раунд до ближайшего .5 или .1

У меня есть набор данных о ценах акций, которые уже округлены до двух знаков после запятой (1234.56). Теперь я пытаюсь округлить до определенного значения, которое отличается для каждого запаса. Вот несколько примеров:

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

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

4b9b3361

Ответ 1

Возможно,

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

Ответ 2

Я не знаком с языком 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

Ответ 3

Пакет 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. Это теперь устарело. См. Комментарий.

Ответ 4

Как то, что сказал ДжошО'Брайен в комментариях: round_any в пакете plyr работает очень хорошо!

> 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

Подробнее читайте здесь: https://www.rdocumentation.org/packages/plyr/versions/1.8.4/topics/round_any