【问题标题】:'newdata' had 10000 rows but variables found have 40000 rows'newdata' 有 10000 行,但找到的变量有 40000 行
【发布时间】:2017-04-30 13:55:36
【问题描述】:

我得到了错误:

'newdata' had 10000 rows but variables found have 40000 rows 
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

【问题讨论】:

  • 这可能对错误没有帮助,但不需要for 循环;试试names(train_frame) &lt;- 1:98names(train_frame) &lt;- seq_along(train_frame)
  • 我试过了,但确实有效。names(train_frame)
  • 它确实有效???
  • 提供一个可重现的例子。
  • train_frame=data$trainData[,-c(65,81)]。为什么要按列索引向量data$trainDatadata 的结构是什么?是列表还是数据框?

标签: r predict


【解决方案1】:

首先,最好不要以数字开头你的变量名。其次,我认为是您编写 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 指的是具有正确变量名的正确数据框。

再一次,一个可重现的例子会很好。

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多