使用tidyverse与base R删列差异及randomForest列选择异常
使用tidyverse与base R删除数据框列的差异,以及randomForest中select函数的异常问题
嘿,咱们先理清tidyverse(主要是dplyr的select)和base R删除数据框列的核心差异,再解决你在randomForest拟合时碰到的异常问题。
一、两种删列方式的核心差异
- Base R 删列的特点:
- 常用负索引:比如
Boston[, -which(names(Boston)=="medv")]或者直接Boston[, -14](如果medv是第14列),但要注意:如果删完只剩一列,结果会自动变成向量,这很容易在后续分析中踩坑 - 直接修改原数据:用
Boston$medv <- NULL的话,会直接在原数据框上删除列,不会返回新的对象
- 常用负索引:比如
- tidyverse(dplyr::select)删列的特点:
- 始终返回数据框/tibble:
select(Boston, -medv)不管剩几列,结果都是规范的表格结构,不会变成向量 - 不修改原数据:默认返回新对象,原数据框保持不变
- 支持灵活的筛选语法:比如
select(Boston, starts_with("rm"), ends_with("age"))这种按列名规则筛选的操作,比base R方便很多
- 始终返回数据框/tibble:
二、randomForest中select函数的异常问题解决
你代码里的问题核心在于:select(Boston[train,], medv)返回的是单列tibble,但randomForest的y参数需要的是向量(分类问题则是因子),tibble格式会被模型误判,导致异常。
修复后的代码示例
library(MASS) library(dplyr) library(purrr) library(randomForest) train <- base::sample(1:nrow(Boston), nrow(Boston)/2) glimpse(Boston) p <- ncol(Boston) - 1 ps <- 1:p map_dbl(ps, ~mean(randomForest( x = select(Boston[train, ], -medv), y = pull(Boston[train, ], medv), # 用pull提取向量代替select xtest = select(Boston[-train, ], -medv), ytest = pull(Boston[-train, ], medv), # 同样用pull处理测试集响应变量 mtry = .x, ntree = 100 # 补全你省略的ntree参数,这里设为100示例 )$test$err.rate[,1])) # 指定取误差率的第一列,避免mean计算出错
关键修复点说明
- 用pull()替代select()提取响应变量:
pull(Boston[train,], medv)会直接把指定列转换成向量,完美匹配randomForest对y参数的要求 - 补全缺失的参数:你代码里的
nt...应该是ntree(树的数量),必须补全具体数值才能让代码正常运行 - 明确误差率提取逻辑:
randomForest返回的结果中,test$err.rate是一个矩阵,需要指定列(比如[,1])才能用mean()计算平均误差
内容的提问来源于stack exchange,提问作者jakes
相关产品推荐
相关产品推荐

