在 R 的数据集中用零替换 -inf、NaN 和 NA 值
Replace -inf, NaN and NA values with zero in a dataset in R
我正在尝试 运行 R 中的一些交易策略。我已经下载了一些股票价格并计算了 returns。新的 return 数据集有许多 -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 替换这些不需要的值?
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
特定的方法可以做到这一点。
编辑:动物园特定的方式是log_ret[which(!is.finite(log_ret))] <- 0
。
根据?zoo
:
Subscripting by a zoo object whose data contains
logical values is undefined.
因此您需要在 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
另一种方法是(其中 df=你的数据帧):
is.na(df)<-sapply(df, is.infinite)
df[is.na(df)]<-0
我不知道这是否适用于动物园对象,但它解决了 is.infinite() 仅适用于向量的问题。
在 dplyr 中使用 mutate_all:
library(dplyr)
fortify.zoo(log_ret) %>% mutate_all(function(x) ifelse(is.infinite(x), 0, x))
由于 mutate_all
的生命周期已被 across
的使用所取代:
library(dplyr)
fortify.zoo(log_ret) %>% mutate(across(.cols = everything(), ~ ifelse(is.infinite(.x), 0, .x)))
我正在尝试 运行 R 中的一些交易策略。我已经下载了一些股票价格并计算了 returns。新的 return 数据集有许多 -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 替换这些不需要的值?
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
特定的方法可以做到这一点。
编辑:动物园特定的方式是log_ret[which(!is.finite(log_ret))] <- 0
。
根据?zoo
:
Subscripting by a zoo object whose data contains logical values is undefined.
因此您需要在 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
另一种方法是(其中 df=你的数据帧):
is.na(df)<-sapply(df, is.infinite)
df[is.na(df)]<-0
我不知道这是否适用于动物园对象,但它解决了 is.infinite() 仅适用于向量的问题。
在 dplyr 中使用 mutate_all:
library(dplyr)
fortify.zoo(log_ret) %>% mutate_all(function(x) ifelse(is.infinite(x), 0, x))
由于 mutate_all
的生命周期已被 across
的使用所取代:
library(dplyr)
fortify.zoo(log_ret) %>% mutate(across(.cols = everything(), ~ ifelse(is.infinite(.x), 0, .x)))