如何在R中收集双重for循环结果生成带多索引的数据框?
双重循环下随机生存森林结果的数据框收集方案
在随机生存森林的调参双重循环中,直接沿用单循环的索引赋值方法会失效,因为双重循环的变量无法直接对应数据框的一维行索引。以下是两种可行的解决方法:
方法一:预分配数据框+计数器填充(推荐,高效)
先根据循环总次数预分配数据框的结构和大小,再通过独立计数器跟踪每一行的位置,避免动态扩容的性能损耗:
library("randomForestSRC") data(veteran, package = "randomForestSRC") # 计算总循环次数:3个block.size × 2个mtry = 6行 total_rows <- 3 * 2 # 预分配数据框,指定列类型和长度 result_df <- data.frame( car = numeric(total_rows), mtry = integer(total_rows), block_size = integer(total_rows) ) row_counter <- 1 # 用于跟踪当前填充的行号 for(j in 1:3){ for(i in 1:2){ # 训练随机生存森林模型 obj <- rfsrc(Surv(time, status) ~ ., data = veteran, ntree = 100, block.size = j, mtry = i, nodesize = 3, samptype = "swr") # 计算car值 car_val <- 1 - get.cindex(obj$yvar[,1], obj$yvar[,2], obj$predicted.oob) # 填充当前行的数据 result_df$car[row_counter] <- car_val result_df$mtry[row_counter] <- i result_df$block_size[row_counter] <- j row_counter <- row_counter + 1 # 计数器自增 } } # 查看结果数据框 print(result_df)
方法二:动态追加行(简洁,适合小循环)
每次循环生成单行数据框,通过rbind()动态追加到结果数据框中,代码更直观但大循环下效率较低:
library("randomForestSRC") data(veteran, package = "randomForestSRC") # 初始化空数据框 result_df <- data.frame() for(j in 1:3){ for(i in 1:2){ obj <- rfsrc(Surv(time, status) ~ ., data = veteran, ntree = 100, block.size = j, mtry = i, nodesize = 3, samptype = "swr") car_val <- 1 - get.cindex(obj$yvar[,1], obj$yvar[,2], obj$predicted.oob) # 生成单行数据并追加 temp_row <- data.frame(car = car_val, mtry = i, block_size = j) result_df <- rbind(result_df, temp_row) } } print(result_df)
关键原因说明
单循环中可以直接用循环变量j作为行索引,是因为变量和行号一一对应;但双重循环有i和j两个变量,行号是两者的组合结果,无法直接用其中一个变量作为行索引,因此需要额外的计数器或动态追加来匹配每一次循环的结果行。
内容的提问来源于stack exchange,提问作者Caterina Venturelli
相关产品推荐
相关产品推荐

