R语言 类型“list”没有实现默认方法,我可以做些什么吗?

tpgth1q7  于 2023-11-10  发布在  其他
关注(0)|答案(1)|浏览(538)

我有一个超过200,000行的数据集,当我执行summary(df)时,我注意到其中包含Inf。但是,当我尝试使用any(is.na(Data) | is.infinite(Data))进行检查时,出现此错误

Error in is.infinite(Data) : 
default method not implemented for type 'list'

然后我试图用NA替换Inf,但我得到了同样的错误。

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

拜托,我是不是做错了什么?

2wnc66cl

2wnc66cl1#

实际上,数据框是list的一种特殊类型,正如消息中所说,is.infinite不能用于列表。

Data <- data.frame(a = c(1, 2, Inf), b = c(-Inf, 3, 4))

Data
#>     a    b
#> 1   1 -Inf
#> 2   2    3
#> 3 Inf    4

is.infinite(Data)
#> Error in is.infinite(Data): default method not implemented for type 'list'

相反,我们需要将NA替换应用到数据框中的每一列。

Data[] <- lapply(Data, function(x) replace(x, is.infinite(x), NA))

Data
#>    a  b
#> 1  1 NA
#> 2  2  3
#> 3 NA  4

另一种需要较少代码的方法是将 Dataframe 动态转换为矩阵,以获得应用于 Dataframe 本身的替换索引,从而进行子集化。

Data <- data.frame(a = c(1, 2, Inf), b = c(-Inf, 3, 4))

replace(Data, is.infinite(as.matrix(Data)), NA)
#>    a  b
#> 1  1 NA
#> 2  2  3
#> 3 NA  4

创建于2023年2月16日,使用reprex v2.0.2

相关问题