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

use*_*784 9 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
Run Code Online (Sandbox Code Playgroud)

如何用0替换这些不需要的值?

the*_*ail 18

按照?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
Run Code Online (Sandbox Code Playgroud)


sie*_*ste 16

Inf,NANaN通过匹配!is.finite,例如

a <- c(1, Inf, NA, NaN)
a[!is.finite(a)] <- 0
# a is now [1, 0, 0, 0]
Run Code Online (Sandbox Code Playgroud)

我不太了解操纵zoo对象,但对于上面的例子

log_ret[1, !is.finite(log_ret)] <- 0
Run Code Online (Sandbox Code Playgroud)

作品.在实际数据中,您将不得不遍历所有行.可能有一种zoo特定的方式来做到这一点.

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


Gru*_*ter 9

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

is.na(df)<-sapply(df, is.infinite)
df[is.na(df)]<-0
Run Code Online (Sandbox Code Playgroud)

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


prm*_*lmu 7

在 dplyr 中使用 mutate_all:

library(dplyr)
fortify.zoo(log_ret) %>% mutate_all(function(x) ifelse(is.infinite(x), 0, x))  
Run Code Online (Sandbox Code Playgroud)


小智 5

由于 的 生命周期mutate_all已被 的使用所取代across

library(dplyr)
fortify.zoo(log_ret) %>% mutate(across(.cols = everything(), ~ ifelse(is.infinite(.x), 0, .x)))
Run Code Online (Sandbox Code Playgroud)