1. ホーム
  2. r

[解決済み] リストオブジェクトを'integer'型に強制する方法、Rでのエラー

2022-02-19 18:13:06

質問

データマイニングや機械学習のためにRを使用する初心者です。Naive Bayes Classifiedについて勉強しているときに、このエラーに遭遇しました。

<ブロッククオート

"エラー in which((sapply(newdata[ind_factor], nlevels) != sapply(tables[ind_factor], : (list) object cannot be coerced to type 'integer'"

これは私のコードです。

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')

最終行を実行すると、上記のようなエラーメッセージが表示されます。どなたか助けてください。 どうもありがとうございました。

解決方法は?

独立変数の1つが文字列または因子変数であり、すべて数値である必要があるようです。以下の私のおもちゃのデータセットを見てください。すべての変数を含めると同じエラーが発生します。しかし、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')