Replace -inf, NaN and NA values with zero in a dataset in R

后端 未结 4 588
深忆病人
深忆病人 2020-12-06 02:10

I am trying to run some trading strategies in R. I have downloaded some stock prices and calculated returns. The new return dataset has a number of -inf, NaN, and NA values.

相关标签:
4条回答
  • 2020-12-06 02:23

    Inf, NA and NaN are matched by !is.finite, for example

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

    I don't know too much about manipulating zoo objects, but for the example above

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

    works. In your actual data you will have to loop over all rows. There might be a zoo-specific way of doing this.

    Edit: The zoo-specific way is log_ret[which(!is.finite(log_ret))] <- 0.

    0 讨论(0)
  • 2020-12-06 02:29

    As per ?zoo:

    Subscripting by a zoo object whose data contains logical values is undefined.

    So you need to wrap the subsetting in a which call:

    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
    
    0 讨论(0)
  • 2020-12-06 02:34

    Another way to do it is (where df=your dataframe):

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

    I don't know if this works for zoo objects, but it gets around the problem of is.infinite() only working on vectors.

    0 讨论(0)
  • 2020-12-06 02:40

    Using mutate_all in dplyr:

    library(dplyr)
    fortify.zoo(log_ret) %>% mutate_all(function(x) ifelse(is.infinite(x), 0, x))  
    
    0 讨论(0)
提交回复
热议问题