我想从 for 循环中获取一个数据帧,在其中我可以更好地可视化代码的结果。我处于随机生存森林的背景下,所以我留下一个例子来更好地解释我。
library("randomForestSRC")
data(veteran, package = "randomForestSRC")
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<-1-get.cindex(obj$yvar[,1], obj$yvar[,2], obj$predicted.oob)
print(c(car, round(i, 0), j))
}}
得到的结果如下:
[1] 0.6748275 1.0000000 1.0000000
[1] 0.6877191 2.0000000 1.0000000
[1] 0.6577519 1.0000000 2.0000000
[1] 0.6826303 2.0000000 2.0000000
[1] 0.6614837 1.0000000 3.0000000
[1] 0.6847789 2.0000000 3.0000000
我想在数据框中收集这些结果,特别是我对“car”的值感兴趣。
我首先只尝试了索引 j 并且得到了我想要的。我已经构建了一个数据框和汽车:
b<- (1:3)
df<-data.frame(b)
car=0
然后,我仅对索引 j 运行相同的循环,并以后续方式获得我想要的数据帧(一列表示 j,一列表示为 car 获得的不同值):
for(j in 1:3){
obj<- rfsrc(Surv(time, status) ~ ., data = veteran,
ntree = 100, block.size = 1, mtry=j, nodesize = 3, samptype = "swr")
df$car[j]<-1-get.cindex(obj$yvar[,1], obj$yvar[,2], obj$predicted.oob)
}
相同的方法不适用于 i 和 j 索引一起使用。我希望有人能给我一些提示来解决这个问题。
最佳答案
必须在循环中处理两个索引可能有点不方便,
特别是因为您不追求数组输出。它可能更容易使用
Map()
以及使用 expand.grid()
创建的组合。同时
您可以改为使用信息更丰富的名称:
fit_car <- function(mtry, block.size) {
obj <- rfsrc(
Surv(time, status) ~ .,
data = veteran,
ntree = 100,
block.size = block.size,
mtry = mtry,
nodesize = 3,
samptype = "swr"
)
car <- 1 - get.cindex(obj$yvar[, 1], obj$yvar[, 2], obj$predicted.oob)
car
}
df <- expand.grid(mtry = 1:2, block.size = 1:3)
df$car <- unlist(Map(fit_car, df$mtry, df$block.size))
df
#> mtry block.size car
#> 1 1 1 0.6857967
#> 2 2 1 0.7095443
#> 3 1 2 0.6437295
#> 4 2 2 0.6921294
#> 5 1 3 0.6640846
#> 6 2 3 0.6917901
关于r - 如何创建一个数据框来收集 R 中具有多个索引的 for 循环的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76349152/