web-dev-qa-db-ja.com

Rのデータセットで-inf、NaN、NAの値をゼロに置き換える

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に置き換えるにはどうすればよいですか?

10
user2641784

?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
20
thelatemail

InfNAおよび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です。

16
sieste

これを行う別の方法は(df = your dataframe)です。

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

これがZooオブジェクトで機能するかどうかはわかりませんが、is.infinite()がベクターでのみ機能するという問題を回避します。

10
Grubbmeister