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

Posted

技术标签:

【中文标题】在 R 的数据集中将 -inf、NaN 和 NA 值替换为零【英文标题】:Replace -inf, NaN and NA values with zero in a dataset in R 【发布时间】:2015-09-08 13:18:29 【问题描述】:

我正在尝试在 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?

【问题讨论】:

stat.ethz.ch/R-manual/R-devel/library/base/html/is.finite.html 【参考方案1】:

根据?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

【讨论】:

【参考方案2】:

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))] &lt;- 0

【讨论】:

我之前也试过。但由于某种原因,数据集中的值都没有改变。 确保不要混淆is.finite()is.infinite()【参考方案3】:

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

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

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

【讨论】:

问题中的 log_ret 不是 data.frame。如果 df 为 log_ret,则此代码会出错。【参考方案4】:

在 dplyr 中使用 mutate_all:

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

【讨论】:

该代码给出错误:Error in UseMethod("tbl_vars") : no applicable method for 'tbl_vars' applied to an object of class "zoo" 这不再给出错误,而是给出了一个数据框,而需要一个动物园对象。【参考方案5】:

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

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

【讨论】:

以上是关于在 R 的数据集中将 -inf、NaN 和 NA 值替换为零的主要内容,如果未能解决你的问题,请参考以下文章

如何在R中将NA替换为1?

r 将多列中的数据合并为一列

R中大数据的计数算法

R(arules)将数据帧转换为事务并删除NA

在数据框中查找包含NA的列的行?

如果焦点变量是NA,则在R中创建具有“替换”变量值的汇总变量