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.finite
和 is.infinite
不支持数据框,因为类似 is.na
的功能支持:
timesData[apply(timesData, 1, function(row) all(is.finite(row))),]
另一种方法是将 timesData 转换为矩阵,然后使用 is.finite
和 is.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
我有一个数据集,我在其中过滤掉了 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.finite
和 is.infinite
不支持数据框,因为类似 is.na
的功能支持:
timesData[apply(timesData, 1, function(row) all(is.finite(row))),]
另一种方法是将 timesData 转换为矩阵,然后使用 is.finite
和 is.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