R语言报错:cbind使用list类型下标无效,求解决方案
解决R代码报错:invalid subscript type 'list'
错误根源
你通过dplyr::filter()生成的train是完整的数据框对象,但后续代码错误地将它当作行索引向量,用于子集化cbind()生成的矩阵。R不允许使用数据框/列表作为下标,因此触发该错误。
修复方案
以下两种方法均可解决问题,按需选择:
方案1:基于行索引划分数据集
先提取训练集的行号,再用行号做子集化:
# 定义需要排除的行 exclude_rows <- c(1:5, 32:36, 60:64) # 获取训练集行号 train_rows <- setdiff(1:nrow(admission), exclude_rows) # 划分训练/测试集 train <- admission[train_rows, ] test <- admission[exclude_rows, ] # 生成特征矩阵和分组变量 train.X <- cbind(admission$GPA, admission$GMAT)[train_rows, ] test.X <- cbind(admission$GPA, admission$GMAT)[exclude_rows, ] train.Group <- admission$Group[train_rows]
方案2:直接从训练数据框提取列
既然已经生成了train数据框,直接从其中提取所需列即可,无需再从原数据集按索引取值:
# 保留原划分代码 train <- admission %>% filter(!row_number() %in% c(1:5, 32:36, 60:64)) test <- rbind(admit, notadmit, border) # 直接从train/test中提取特征和分组 train.X <- cbind(train$GPA, train$GMAT) test.X <- cbind(test$GPA, test$GMAT) train.Group <- train$Group
优化建议
用dplyr的slice()函数可以更简洁地划分数据集:
exclude_rows <- c(1:5, 32:36, 60:64) train <- admission %>% slice(-exclude_rows) test <- admission %>% slice(exclude_rows)
内容的提问来源于stack exchange,提问作者Remonda Hanna
相关产品推荐
相关产品推荐

