首页 > 解决方案 > 如何强制列表对象键入“整数”,R中的错误

问题描述

我是使用 R 进行数据挖掘和机器学习的新手。在我研究 Naive Bayes Classified 时,我遇到了这个错误:

“错误其中((sapply(newdata [ind_factor],nlevels)!= sapply(tables [ind_factor],:(列表)对象不能被强制输入'整数'”

这是我的代码:

data <- read.csv(file.choose(),header = T) 
str(data)
set.seed(1234)
splitData <- sample(2,nrow(data),replace = T,prob = c(0.8,0.2))
train<-data[splitData == 1,]
test <- data[splitData == 2,]
mdl <- naive_bayes(admit ~ .,data = train)
predicted <- predict(mdl, train, type = 'prob')

当我运行最后一行时,它会抛出上面的错误消息。谁能帮帮我!非常感谢。

标签: rdata-science

解决方案


看起来您的自变量之一是字符串或因子变量,并且都必须是数字。请参阅下面的我的玩具数据集。包含所有变量时出现相同的错误;但是,当我取出 var4 (其中变量是字符串)时,它可以工作)。

如果要使用变量,可以将字符串变量转换为因子,然后将因子转换为数值变量(这将捕获因子的基础值)。

library(naivebayes)
#data <- read.csv(file.choose(),header = T) 
data <- data.frame(admit = sample(100, x=c(F,T), prob=c(.5,.5), replace=T),
           var1 = sample(100, x=1:4, replace=T),
           var2 = sample(100, x=1:3, replace=T),
           var3 = sample(100, x=1:3, replace=T),
           var4 = sample(100, x=c("s1", "s2"), replace=T))

str(data)
set.seed(1234)
splitData <- sample(2,nrow(data),replace = T,prob = c(0.8,0.2))
train<-data[splitData == 1,]
test <- data[splitData == 2,]

# Doesn't work
mdl <- naive_bayes(admit ~ .,data = train)
predicted <- predict(mdl, train, type = 'prob')

# Works
mdl <- naive_bayes(admit ~ var1 + var2 + var3,data = train)
predicted <- predict(mdl, train, type = 'prob')

# Convert string to factor then numeric
train$var4 <- as.numeric(as.factor(train$var4))

mdl <- naive_bayes(admit ~ .,data = train)
predicted <- predict(mdl, train, type = 'prob')

推荐阅读