在 R 的 data.table 中如何替换 Inf / 显示各列中 Inf 的数量

4

我不知道如何在R中使用类似is.na(x)的函数来处理无限数字,也不知道如何针对每一列显示有多少个Inf:colSums(is.infinite(x))

我使用以下示例数据集:

DT <- data.table(a=c(1/0,1,2/0),b=c("a","b","c"),c=c(1/0,5,NA))
DT
     a b   c
1: Inf a Inf
2:   1 b   5
3: Inf c   NA
colSums(is.na(DT))
a b c 
0 0 1 
colSums(is.infinite(DT))
Error in is.infinite(DT) : default method not implemented for type 'list'
DT[is.na(DT)] <- 100
 DT
     a b   c
1: Inf a Inf
2:   1 b   5
3: Inf c 100

DT[is.infinite(DT)] <- 100
Error in is.infinite(DT) : default method not implemented for type 'list'

我在这篇文章中找到了如何用NA替换Inf的方法,但我认为还应该有更好的方法来实现,例如使用is.infinite。另外,我想看到每列中的Inf,有什么想法吗?
非常感谢。 BR Tim
1个回答

6

is.finiteis.infinite没有像is.na一样的data.framedata.table方法(比较methods(is.infinite)methods(is.na))。

您可以通过循环列,然后使用colSums来实现。

DT[, colSums(sapply(.SD, is.infinite))]
# a b c 
# 2 0 1 

你也可以使用Reduce代替colSums

DT[, Reduce(`+`, lapply(.SD, is.infinite))]
## [1] 2 0 1

另一种选择是创建自己的自定义函数,然后将其循环应用于列。
Myfunc <- function(x) sum(is.infinite(x))
DT[, lapply(.SD, Myfunc)]
#    a b c
# 1: 2 0 1

当然,你也可以编写 data.frame 方法来检查是否为无穷大,因为它似乎是通用的(参见 ?is.infinite)。

2
另外,使用colSums(DT=='Inf', na.rm=TRUE)也可以实现,虽然不够优雅。 - akrun
@akrun 是的,我总是忘记这也可以工作,虽然我不确定为什么。 - David Arenburg
不需要引号,我认为它必须以与DT == 1或其他值相同的方式工作。 - akrun
1
@akrun 对我来说,它仍然有些可疑。文档明确指出“不要测试等于NaN”,但没有提及任何关于Inf的内容。 - David Arenburg
@akrun,@Frank刚指出我们还需要涵盖-Inf。我完全忘了。 - David Arenburg
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接