2015-06-22 32 views
7

Tôi đang cố chạy một số chiến lược giao dịch trong R. Tôi đã tải xuống một số giá cổ phiếu và trả về được tính toán. Bộ dữ liệu trả về mới có một số giá trị -inf, NaN và NA. Tôi đang tái tạo một hàng của tập dữ liệu (log_ret). Sở thú của nó.Thay thế giá trị -inf, NaN và NA bằng 0 trong tập dữ liệu trong R

library(zoo) 
log_ret <- structure(
    c(0.234,-0.012,-Inf,NaN,0.454,Inf), .Dim = c(1L, 6L), 
    .Dimnames = list(NULL, c("x", "y", "z", "s", "p", "t")), 
    index = structure(12784, class = "Date"), 
    class = "zoo" 
) 

       x  y z s  p t 
2005-01-01 0.234 -0.012 -Inf NaN 0.454 Inf 

Làm cách nào để thay thế các giá trị không mong muốn này bằng 0?

+3

https://stat.ethz.ch/R-manual/R-devel/library/base/html/is.finite.html – user227710

Trả lời

13

Theo ?zoo:

Subscripting bởi một đối tượng sở thú có dữ liệu chứa giá trị logic là không xác định.

Vì vậy, bạn cần phải quấn Subsetting trong một cuộc gọi which:

log_ret[which(!is.finite(log_ret))] <- 0 
log_ret 
       x  y z s  p t 
2005-01-01 0.234 -0.012 0 0 0.454 0 
12

Inf, NANaN được kết hợp bởi !is.finite, ví dụ

a <- c(1, Inf, NA, NaN) 
a[!is.finite(a)] <- 0 
# a is now [1, 0, 0, 0] 

Tôi không biết quá nhiều về thao tác zoo đối tượng, nhưng đối với ví dụ trên

log_ret[1, !is.finite(log_ret)] <- 0 

công trình. Trong dữ liệu thực tế của bạn, bạn sẽ phải lặp qua tất cả các hàng. Có thể có zoo cách đặc biệt để thực hiện việc này.

Chỉnh sửa: Cách cụ thể theo sở thú là log_ret[which(!is.finite(log_ret))] <- 0.

+0

Tôi đã thử điều đó trước đó. Nhưng vì lý do nào đó, không có giá trị nào trong tập dữ liệu thay đổi. – user2641784

2

Một cách khác để làm điều đó là (nơi df = dataframe của bạn):

is.na(df)<-sapply(df, is.infinite) 
df[is.na(df)]<-0 

tôi không biết nếu điều này làm việc cho các đối tượng sở thú, nhưng nó được xung quanh vấn đề của is.infinite() chỉ làm việc trên vectơ.

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