将is.infinite()应用于R中的数据帧的方法

时间:2016-05-25 12:37:25

标签: r dataframe

我想知道为什么我不能将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值?

2 个答案:

答案 0 :(得分:2)

以下是一种方法,使用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的默认方法处理原子向量,列表和pairlists:对于anyNA也处理NULL。

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

答案 1 :(得分:0)

正如@Imo所说,is.na()已设置为处理列表/ data.frames,而is.infinite()只能处理向量。但是,您可以使用sapply()

解决此问题
df[sapply(df, simplify = 'matrix', is.infinite)] <- 0

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