【问题标题】:Methods for applying is.infinite() to a data frame in R将 is.infinite() 应用于 R 中的数据框的方法
【发布时间】:2016-05-25 12:37:24
【问题描述】:

我想知道为什么我不能将 is.infinite() 应用于数据帧,就像我可以将 is.na 应用于 R 中的数据帧一样:

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

data[is.na(data)] <-0

不会产生错误,但是 is.infinite 上的文档暗示与 is.na? 相同的行为。

有人知道如何替换 inf 值吗?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    这是一种方法,使用lapplyifelse

    # create data.frame
    df <- data.frame(a=1:10, b=letters[1:10], c=rnorm(10))
    df$a[c(2,6)] <- Inf
    df$c[c(3,9)] <- Inf
    
    # take care of those infs:
    df[] <- lapply(df, function(i) if(is.numeric(i)) ifelse(is.infinite(i), 0, i) else i)
    

    我认为问题在于 x is.infinite(x)is.na(x)?is.infinite 的帮助文件说

    x待测R对象:默认方法处理原子向量

    对于?is.na,它说

    x 要测试的 R 对象:is.na 的默认方法处理原子向量、列表和对列表:anyNA 的默认方法也处理 NULL。

    所以is.infinite 的默认方法不处理is.na 所在的列表(data.frames)。

    【讨论】:

      【解决方案2】:

      正如@Imo 所说,is.na() 已设置为在列表/data.frames 上工作,而is.infinite() 只能在向量上工作。但是,您可以使用sapply() 解决此问题:

      df[sapply(df, simplify = 'matrix', is.infinite)] <- 0
      

      这将选择 df 中所有无限的单元格并在其中插入“0”。关键是将is.infinite 应用于数据框的每一列,然后让sapply 将结果简化为可用于选择单元格的逻辑矩阵。这(我相信)基本上是 is.na 在幕后所做的,您将其应用于数据框。

      【讨论】:

        猜你喜欢
        • 2018-10-25
        • 2019-01-20
        • 2020-04-08
        • 2020-03-09
        • 2021-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多