You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 08:25:28