2011-12-29 39 views
32

Tôi có tập dữ liệu giá cổ phiếu đã được làm tròn thành 2 chữ số thập phân (1234.56). Tôi hiện đang cố gắng làm tròn đến một giá trị cụ thể khác nhau cho mỗi cổ phiếu. Dưới đây là một số ví dụ:R vòng tới gần nhất .5 hoặc .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 
    ...        ...      ... 

Tôi không thực sự chắc chắn cách thực hiện điều này nhưng tôi mở để đề xuất.

Trả lời

50

Có lẽ,

round(a/b)*b 

sẽ làm việc.

> 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' trong gói' plyr' là một hàm tốt đẹp thực hiện thuật toán rất này. Nó cũng lấy một đối số bổ sung 'f', với các lựa chọn' "tròn" ',' "trần" ', hoặc' "sàn" '. –

+0

Được thực hiện tốt. Cảm ơn nhiều! – screechOwl

+0

@ JoshO'Brien - Bạn nên làm cho câu trả lời này riêng biệt, vì mọi người thường không tìm trong các ý kiến ​​ –

7

Gói taRifx chỉ có như vậy một hàm:

> 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 

Trong trường hợp của bạn, chỉ cần ăn nó giá cổ phiếu và thặng dư đánh dấu tối thiểu như các đối số đầu tiên và thứ hai của nó, và nó sẽ làm việc kỳ diệu của nó.

N.B. Điều này hiện không được chấp nhận. Xem nhận xét.

+0

nên '0,36' cho các dấu '0,1' là' 0,4'? – kohske

+1

Tôi nghĩ rằng làm tròn 0,36 đến 0,1 gia tăng gần nhất sẽ dẫn đến 0,4. –

+1

Điểm tốt. Thuật toán được sử dụng là phức tạp lúng túng so với giải pháp của kohske: frac = vec/roundvec; retvec = vec - (frac - sàn (frac)) * roundvec. Cho rằng chức năng này đã tồn tại trong plyr, tôi có khả năng sẽ không dùng nữa roundnear và trỏ mọi người tới round_any. –

10

Tôi không quen với ngôn ngữ R, nhưng phương pháp của tôi sẽ hoạt động với bất kỳ ngôn ngữ nào có chức năng trần. Tôi giả định nó được làm tròn lên đến gần nhất: 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

Chức năng trong R được gọi là 'trần' –

+2

Nó có lẽ tốt hơn để viết 'a = trần (a/0.5) * 0.5' kể từ' a * 2' = 'a/0.5' và' x/2' = 'x * 0,5' –

+0

Ngoài ra, bạn có thể thay thế' trần' bằng 'tầng' trong mã này để làm tròn xuống 0,5 gần nhất. – coip

Các vấn đề liên quan