Remplacer les valeurs inf, NaN et NA par zéro dans un ensemble de données en R

j'essaie d'exécuter quelques stratégies de trading en R. j'ai téléchargé quelques cours des actions et des rendements calculés. Le nouvel ensemble de données return contient un certain nombre de valeurs-inf, NaN et NA. Je reproduit une rangée de l'ensemble de données (log_ret). C'est un ensemble de données du zoo.

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

Comment puis-je remplacer ces valeurs indésirables avec 0?

8
demandé sur thelatemail 2015-06-23 01:34:21

3 réponses

selon ?zoo:

inscription par un objet zoo dont les données contiennent les valeurs logiques ne sont pas définies.

vous devez donc envelopper le sous-ensemble dans un which appel:

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
15
répondu thelatemail 2015-06-22 23:23:19

Inf, NA et NaN correspondent à !is.finite, par exemple

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

je ne sais pas trop à propos de la manipulation zoo objets, mais pour l'exemple ci-dessus

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

fonctionne. Dans vos données actuelles, vous devrez boucler toutes les lignes. Il pourrait y avoir un zoode manière spécifique de le faire.

Edit: la voie propre au zoo est log_ret[which(!is.finite(log_ret))] <- 0.

12
répondu sieste 2015-06-22 23:30:49

une Autre façon de le faire est (où df=votre dataframe):

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

Je ne sais pas si cela fonctionne pour les objets de zoo, mais il obtient le problème de est.l'infini() ne travaillent que sur des vecteurs.

3
répondu Grubbmeister 2017-05-05 07:22:53