在R中的数据集中将-inf,NaN和NA值替换为零

时间:2015-06-22 22:34:22

标签: r time-series nan zoo

我正在尝试在R中运行一些交易策略。我已经下载了一些股票价格和计算回报。新的返回数据集具有多个-inf,NaN和NA值。我正在复制一行数据集(log_ret)。它是一个动物园数据集。

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?

4 个答案:

答案 0 :(得分:16)

根据ComboBox

  

由数据包含的动物园对象进行订阅        逻辑值未定义。

因此,您需要将子集包装在?zoo调用中:

which

答案 1 :(得分:12)

InfNANaN!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特定的方式来执行此操作。

编辑:特定于动物园的方式为log_ret[which(!is.finite(log_ret))] <- 0

答案 2 :(得分:6)

另一种方法是(其中df =你的数据帧):

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

我不知道这是否适用于动物园对象,但是它解决了is.infinite()只能处理向量的问题。

答案 3 :(得分:1)

在dplyr中使用mutate_all:

library(dplyr)
fortify.zoo(log_ret) %>% mutate_all(function(x) ifelse(is.infinite(x), 0, x))