如何修复:randomforest.default(m, y, …):外部函数调用中的 na/nan/inf
在 R 中您可能遇到的错误是:
Error in randomForest.default(m, y, ...): NA/NaN/Inf in foreign function call (arg 1)
发生此错误的原因有两个:
- 数据集中存在 NA、NaN 或 Inf 值
- 数据集中的变量之一是字符
修复此错误的最简单方法是删除缺少数据的行并将字符变量转换为因子变量:
#remove rows with missing values df <- na. omitted (df) #convert all character variables to factor variables library (dplyr) df %>% mutate_if(is. character , as. factor )
本教程分享了如何在实践中修复此错误的示例。
如何重现错误
假设我们尝试将随机森林拟合到 R 中的以下数据框:
library (randomForest)
#create data frame
df <- data. frame (y <- c(30, 29, 30, 45, 23, 19, 9, 8, 11, 14),
x1 <- c('A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C'),
x2 <- c(4, 4, 5, 7, 8, 7, 9, 6, 13, 15))
#attempt to fit random forest model
model <- randomForest(formula = y ~ ., data = df)
Error in randomForest.default(m, y, ...):
NA/NaN/Inf in foreign function call (arg 1)
我们收到错误,因为 x1 是数据框中的字符变量。
我们可以通过使用str()函数显示数据框的结构来确认这一点:
str(df)
'data.frame': 10 obs. of 3 variables:
$ y....c.30..29..30..45: num 30 29 30 45 23 19 9 8 11 14
$ x1....c..A....A....B....B.... : chr "A" "A" "B" "B"
$ x2....c.4..4..5..7..: num 4 4 5 7 8 7 9 6 13 15
如何修复错误
要修复此错误,我们可以使用dplyr的mutate_if()函数将每个字符列转换为因子列:
library (dplyr)
#convert each character column to factor
df = df %>% mutate_if(is. character , as. factor )
然后我们可以将随机森林模型拟合到数据框:
#fit random forest model
model <- randomForest(formula = y ~ ., data = df)
#view summary of model
model
Call:
randomForest(formula = y ~ ., data = df)
Type of random forest: regression
Number of trees: 500
No. of variables tried at each split: 1
Mean of squared residuals: 65.0047
% Var explained: 48.64
这次我们没有收到任何错误,因为数据框中不再有字符变量。
其他资源
以下教程解释了如何解决 R 中的其他常见错误:
如何修复:条件长度 > 1 并且仅使用第一个元素
如何在 R 中修复:dim(X) 必须具有正长度
如何修复 R:需要 true/false 的缺失值
如何修复:强制引入的 NA