我有一个股票价格数据集已经四舍五入到小数点后两位(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)
小智 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)
小智 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
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现在已经弃用了.见评论.