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?
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
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
.
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.