web-dev-qa-db-fra.com

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

J'essaie d'exécuter certaines stratégies de trading dans R. J'ai téléchargé des cours boursiers et calculé les rendements. Le nouvel ensemble de données de retour a un certain nombre de valeurs -inf, NaN et NA. Je reproduis une ligne de l'ensemble de données (log_ret). C'est un jeu de données 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 par 0?

10
user2641784

Selon ?zoo:

L'indexation par un objet Zoo dont les données contiennent des valeurs logiques n'est pas définie.

Vous devez donc envelopper le sous-ensemble dans un appel 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
20
thelatemail

Inf, NA et NaN sont mis en correspondance par !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 comment manipuler les objets Zoo, mais pour l'exemple ci-dessus

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

travaux. Dans vos données réelles, vous devrez boucler sur toutes les lignes. Il peut exister une méthode spécifique à Zoo.

Edit: La manière spécifique au Zoo est log_ret[which(!is.finite(log_ret))] <- 0.

16
sieste

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 Zoo, mais cela contourne le problème de is.infinite () ne fonctionnant que sur des vecteurs.

10
Grubbmeister