Replace -inf, NaN and NA values with zero in a dataset in R
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
.
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.
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