2017-04-30 30 views
-1

我得到了錯誤:「newdata」有10000行,但發現變量有40000行「newdata」有10000行,但發現變量有40000行

train_frame=data$trainData[,-c(65,81)] 
for (i in 1:98){ 
names(train_frame)[i]<-i 
} 

lda(data$trainLabel~ train_frame,prior=rep(1,10)/10,method='moment')->lda_equal_prior prediction_frame=data.frame(data$testData[,-c(65,81)]) 
for (i in 1:98){ 
names(prediction_frame)[i]<-paste('train_frame',i,sep='') 
} 
predict(lda_equal_prior,data.frame(prediction_frame))->prediction_lda_equal_prior 
+1

這可能不會有助於出錯,但不需要for循環;嘗試'名(train_frame)< - 1:98'或'名(train_frame)< - seq_along(train_frame)' – manotheshark

+0

我都試過,但它確實work.names(train_frame)< - seq_along(train_frame)和名稱(prediction_frame)< - seq_along(prediction_frame) –

+1

它確實有效? –

回答

0

第一件事,第一,它始終是很好的做法,不是用數字開始變量名稱。其次,我認爲這是你寫你的lda函數的方式導致的警告(我相信它提供了一個警告信息,而不是錯誤)。 lda_equal_prior中的變量名稱是指data對象(我仍然不確定它是列表還是數據框)。儘管如此,prediction_frame沒有相同的變量名稱,因爲您真正想要的是來自train_frame的變量名稱。所以predict實際上重用了data的名字,因此是警告。假設data是一個列表,請嘗試:

# Create training frame 
train_frame = data.frame(data$trainLabel, data$trainData[,-c(65,81)]) 
names(train_frame)[-1] = paste0("V", 1:98) 

# Run LDA with trainLabel on the rest 
lda_equal_prior = lda(trainLabel ~ ., data = train_frame, 
prior = rep(1,10)/10, method='moment') 

# Create prediction frame 
prediction_frame = data.frame(data$testData[,-c(65,81)]) 
names(prediction_frame) = paste0("V", 1:98) 

# Predict using newdata 
prediction_lda_equal_prior = predict(lda_equal_prior, newdata = prediction_frame) 

這裏我結合trainLabeltrainData,所以lda是指用正確的變量名的正確數據幀。

再次,一個可重複的例子會很好。