R:在对数据帧进行子集化时进行循环

R: for loop while subsetting a dataframe

我正在执行文本分类,我已经创建了特征并且我有多个标签来训练和预测它们基本上是我想要预测的二进制变量。

这是我的代码和错误日志。

for (col in colnames(train_data)){
  train_label <- train_data[,c(col)]
  test_pred <- knn(train = train_mat[ ,!(colnames(train_mat) == "Sentiment")], test = test_mat[ ,!(colnames(test_mat) == "Sentiment")], cl = as.factor(train_label), k=6)

  table(test_pred,test_data[, col])
  acc.RF = mean(test_pred==test_data[, col])
  acc.RF
  confusionMatrix(table(test_pred,test_data[, col]))
}

Error in knn(train = train_mat[, !(colnames(train_mat) == "Sentiment")],  : 
  'train' and 'class' have different lengths
  1. train/test_data = 原始数据帧
  2. train/test_mat = TFIDF 特征 原始目标变量存在于 train/test_data.

我收到以下错误。

情绪是一个变量,主要用来预测,但我想用train/test原始df中存在的所有变量进行训练。

拜托,在 train/test_mat 中,我附加了 Sentiment 列,所以我在向 KNN 提供特征时将其排除。

一个可能的问题是 R 期望向量进入 cl 但你有一个 data.table。与 data.frame 不同,在直角坐标系中选择长度为 1 的单列会产生暗淡 n 倍 1 的 data.table。在 data.table 上调用 length 会给出列数这是 1。knn 的内部将该长度与 train 中的行数进行比较并抛出错误。尝试使用 train_data[[col]] 进行子集化。

考虑 Mapmapply 的包装器,并构建一个混淆矩阵列表,传递来自 testtrain[ 的每一列=19=] 数据元素。此外,考虑 transform 删除 Sentiment:

matrix_process <- function(test_label, train_label) {

  test_pred <- knn(train = transform(train_mat, Sentiment = NULL), 
                   test = transform(test_mat, Sentiment = NULL), 
                   cl = as.factor(train_label), k=6)

  print(table(test_pred, test_label))
  acc.RF = mean(test_pred == test_label)
  print(acc.RF)

  return(confusionMatrix(table(test_pred, test_label)))    
}

conf_matrix_list <- Map(matrix_process, test_data, train_data)

# EQUIVALENTLY:
conf_matrix_list <- mapply(matrix_process, test_data, train_data, SIMPLIFY=FALSE)