2015-06-22 12 views
7

Sto provando a eseguire alcune strategie di trading in R. Ho scaricato alcuni prezzi delle azioni e ritorni calcolati. Il nuovo set di dati di ritorno ha un numero di valori -inf, NaN e NA. Sto riproducendo una riga del set di dati (log_ret). È un dataset dello zoo.Sostituisci valori inf, NaN e NA con zero in un set di dati in 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 

Come posso sostituire questi valori indesiderati con 0?

+3

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

risposta

13

Secondo ?zoo:

subscripting da un oggetto zoo cui dati contiene valori logici è indefinito.

quindi è necessario avvolgere il subsetting in una chiamata 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, NA e NaN sono accompagnati da !is.finite, ad esempio

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

Non so troppo di manipolare zoo oggetti, ma per l'esempio precedente

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

opere. Nei tuoi dati effettivi dovrai eseguire il ciclo su tutte le righe. Potrebbe esserci un modo specifico per fare questo zoo.

Modifica: Il modo specifico per lo zoo è log_ret[which(!is.finite(log_ret))] <- 0.

+0

Ho provato anche quello prima. Ma per qualche ragione, nessuno dei valori nel set di dati è cambiato. – user2641784

2

Un altro modo per farlo è (dove df = il vostro dataframe):

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

non lo faccio so se questo funziona per gli oggetti zoo, ma aggira il problema di is.infinite() funziona solo sui vettori.

Problemi correlati