【问题标题】:Replace Inf in R data.table / Show number of Inf in colums替换 R data.table 中的 Inf / 在列中显示 Inf 的数量
【发布时间】:2015-08-01 22:47:47
【问题描述】:

我无法弄清楚如何使用 is.na(x) 之类的函数来处理 R 中的无限数和数据表,或者显示每列有多少 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'

我在this post 中找到了如何用 NA 替换 Inf,但我想说应该有更好的方法来实现这一点,例如 is.infinite。我想看看 Inf 的每列,对此有什么想法吗?

非常感谢。 BR蒂姆

【问题讨论】:

    标签: r data.table infinite na


    【解决方案1】:

    is.finiteis.infinite 没有 data.framedata.table 方法,如 is.na 有(比较 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
    

    当然,您也可以为is.infinite 编写data.frame 方法,因为它看起来是通用的(请参阅?is.infinite)。

    【讨论】:

    • 另外,colSums(DT=='Inf', na.rm=TRUE) 也可以,虽然不优雅
    • @akrun 是的,我也总是忘记这个工作,虽然我不知道为什么。
    • 虽然不需要引号,但我认为它必须以与 DT==1 或其他值相同的方式工作
    • @akrun 在我看来它仍然有些可疑。文档清楚地写着“不要测试与 NaN 的相等性”,尽管它没有提到任何关于 Inf
    • @akrun, @Frank 刚刚指出我们还需要覆盖-Inf。完全忘记了我的想法
    猜你喜欢
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 2019-09-26
    • 2021-06-29
    • 2019-11-10
    • 2018-07-13
    • 2015-09-08
    • 1970-01-01
    相关资源
    最近更新 更多