R在数据集中定位有限值

R locating finite values in dataset

我有一个数据集,我在其中过滤掉了 NA 值并计划拟合一般线性模型来预测内容。 但是,当我这样做时:

     model<-bayesglm(total_score ~ ., data=traint)

我收到以下错误:

     Error in lm.fit(x = x.star[good.star, , drop = FALSE] * w.star, y = z.star *  : 
         NA/NaN/Inf in 'y'

基于之前的 post: lm() NA/NaN/Inf error ,我试图消除数据集的有限值....

已检查此类有限值:

     summary(timesData)

     output too long to show

我找不到任何符号告诉我如何以可以过滤掉这些有限值的方式对数据进行子集化....

无论如何,我的尝试如下:

    train<-subset(timesData, !is.finite(timesData))

自然地,因为我没有指定我得到的列:

    Error in is.finite(timesData) : 
     default method not implemented for type 'list'

我试过了 lapply:

    lapply(timesData, byrow=F, is.finite(timesData))

但是

    Error in FUN(X[[i]], ...) : 
       2 arguments passed to 'is.finite' which requires 1

所以总的来说,我的问题是当“summary()”没有显示它们所在的列时,我如何找到数据集中的有限值以及如何我可以使用 lapply 来摆脱它们吗?

我的数据在 kaggle 上公开可用:https://www.kaggle.com/mylesoneill/world-university-rankings

这里有一些你可以尝试的东西,奇怪的是 is.finiteis.infinite 不支持数据框,因为类似 is.na 的功能支持:

timesData[apply(timesData, 1, function(row) all(is.finite(row))),]

另一种方法是将 timesData 转换为矩阵,然后使用 is.finiteis.infinite 两者都已为 class "matrix" 实现:

timesData[rowSums(is.infinite(as.matrix(timesData))) == 0, ]

这通常应该比 apply 方法更快。

解决它的一种方法是遍历列,并用一些合理的值替换无限值,例如零或 -1(取决于您的数据) 例如:

for (f in names(train)) {
  timesData[,f]<-ifelse(is.finite(timesData[,f]), timesData[,f], -1)
}
     df = data.frame(
      a = c(2,4/0,5), 
      b = c(1/0,3,5), 
      c = c(4,3,5))
     df
        a   b c
    1   2 Inf 4
    2 Inf   3 3
    3   5   5 5

#which columns have infinite values  
 is.infinite(colSums(df))
    a     b     c 
 TRUE  TRUE FALSE 

#only rows with finite values
   df[is.finite(rowSums(df)), ]
      a b c
    3 5 5 5

#or with apply and all     
   df[apply(apply(df, 2,is.finite),1,all),]
      a b c
    3 5 5 5