R舍入到最接近的.5或.1

scr*_*Owl 40 r rounding r-faq

我有一个股票价格数据集已经四舍五入到小数点后两位(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
   ...                              ...                       ...
Run Code Online (Sandbox Code Playgroud)

我不是很确定如何做到这一点,但我愿意接受建议.

koh*_*ske 69

大概,

round(a/b)*b
Run Code Online (Sandbox Code Playgroud)

会做的工作.

> 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
Run Code Online (Sandbox Code Playgroud)

  • 在`plyr`包中的FWIW,`round_any`是实现这个算法的一个很好的函数.它还需要一个额外的参数`f`,选择"圆","天花板"或"地板". (27认同)

小智 15

我不熟悉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
Run Code Online (Sandbox Code Playgroud)

  • 写一个'a = ceiling(a/0.5)*0.5`可能更好,因为`a*2` =`a/0.5`和`x/2` =`x*0.5` (3认同)
  • 另外,您可以在此代码中将“ceiling”替换为“floor”,以向下舍入到最接近的 0.5。 (2认同)

小智 10

就像 JoshO'Brien 在评论中所说的: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
Run Code Online (Sandbox Code Playgroud)

在此处阅读更多信息:https : //www.rdocumentation.org/packages/plyr/versions/1.8.4/topics/round_any


Ari*_*man 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
Run Code Online (Sandbox Code Playgroud)

在您的情况下,只需将股票价格和最小价格增量作为其第一个和第二个参数,它就应该发挥作用.

NB现在已经弃用了.见评论.

  • 好点子。与 kohske 的解决方案相比,所使用的算法令人尴尬地复杂: frac = vec/roundvec; retvec = vec - (frac - floor(frac)) * roundvec。鉴于此功能已存在于 plyr 中,我可能会弃用 roundnear 并将人们指向 round_any。 (2认同)
  • 按照你的说法,这已经弃用了 (2认同)