Rでいくつかの取引戦略を実行しようとしています。株価と計算されたリターンをダウンロードしました。新しい戻りデータセットには、-inf、NaN、NAの値がいくつかあります。データセット(log_ret)の行を複製しています。その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
これらの不要な値を0に置き換えるにはどうすればよいですか?
?zoo
:
データに論理値が含まれるZooオブジェクトによる添え字は定義されていません。
したがって、サブセットを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
およびNaN
は_!is.finite
_と一致します。たとえば、
_a <- c(1, Inf, NA, NaN)
a[!is.finite(a)] <- 0
# a is now [1, 0, 0, 0]
_
Zoo
オブジェクトの操作についてはあまり知りませんが、上記の例では
_log_ret[1, !is.finite(log_ret)] <- 0
_
動作します。実際のデータでは、すべての行をループする必要があります。これを行うにはZoo
固有の方法があるかもしれません。
編集: Zoo固有の方法はlog_ret[which(!is.finite(log_ret))] <- 0
です。
これを行う別の方法は(df = your dataframe)です。
is.na(df)<-sapply(df, is.infinite)
df[is.na(df)]<-0
これがZooオブジェクトで機能するかどうかはわかりませんが、is.infinite()がベクターでのみ機能するという問題を回避します。