循环追加数据框报错:无法将'closure'类型强制转为'list'类型
10折交叉验证循环中rbind报错及优化方案
问题背景
尝试在循环中执行10折交叉验证,将每折测试集的预测值存入空数据框,现有代码如下:
for(i in 1:10){ testIndexes <- which(folds==i,arr.ind=TRUE) testData <- Data[testIndexes, ] trainData <- Data[-testIndexes, ] fit_train<-lmer(values~PTAH_base+PTAL_base+PTAU_base+ChemoDose+RT+(1|SAMPLE_NAME),data=trainData) pred_test <- predict(fit_train,newdata=testData,allow.new.levels=TRUE) df = rbind(df,pred_test) }
运行时最后一行df = rbind(df,pred_test)出现错误:
Error in base::rbind(...) : cannot coerce type 'closure' to vector of type 'list'
错误原因
- 未初始化目标数据框:循环前未定义
df变量,R会默认匹配同名的内置函数(df()是stats包的密度函数),导致rbind尝试拼接函数对象和预测结果,触发类型不兼容错误。 - 预测结果类型不匹配:
predict.lmer返回的是向量而非数据框,直接用rbind拼接向量和未初始化的"函数对象",进一步加剧了类型冲突。
修复方案
1. 提前初始化空数据框
在循环开始前,创建结构匹配的空数据框:
# 初始化空数据框,指定列名和数值类型 df <- data.frame(predicted_values = numeric(0))
2. 转换预测结果为数据框后拼接
将向量格式的pred_test转为数据框,再执行追加操作:
for(i in 1:10){ testIndexes <- which(folds==i,arr.ind=TRUE) testData <- Data[testIndexes, ] trainData <- Data[-testIndexes, ] fit_train<-lmer(values~PTAH_base+PTAL_base+PTAU_base+ChemoDose+RT+(1|SAMPLE_NAME),data=trainData) pred_test <- predict(fit_train,newdata=testData,allow.new.levels=TRUE) # 把预测向量转为数据框,保持列名一致 pred_df <- data.frame(predicted_values = pred_test) df <- rbind(df, pred_df) }
更优的循环追加方案
循环中频繁使用rbind会反复分配内存,数据量大时效率极低。推荐用列表存储中间结果,最后一次性合并:
# 初始化空列表 pred_list <- list() for(i in 1:10){ testIndexes <- which(folds==i,arr.ind=TRUE) testData <- Data[testIndexes, ] trainData <- Data[-testIndexes, ] fit_train<-lmer(values~PTAH_base+PTAL_base+PTAU_base+ChemoDose+RT+(1|SAMPLE_NAME),data=trainData) pred_test <- predict(fit_train,newdata=testData,allow.new.levels=TRUE) # 将每折结果存入列表 pred_list[[i]] <- data.frame(predicted_values = pred_test) } # 一次性合并所有列表元素为数据框 df <- do.call(rbind, pred_list)
如果使用dplyr包,合并步骤可简化为:
library(dplyr) df <- bind_rows(pred_list)
内容的提问来源于stack exchange,提问作者sabc04
相关产品推荐
相关产品推荐

