英文:
How can I create a dataframe which collect the results of a for loop with multilple indexes in R?
问题
我想从一个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,我得到了我想要的内容。我构建了一个数据框和"car":
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索引一起的相同方法不起作用。我希望有人能给我一些提示来解决这个问题。
英文:
I want to obtain from a for loop a dataframe in which i can visualize better the result of the code. I'm in the context of Random survival forest, so I leave an example to explain me better.
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))
}}
the result obtained is the following:
[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
I want to collect this results in a dataframe, in particular i'm interested in the values of "car".
I've firstly tried only with the index j and I've obtained what i want. I have built a dataframe and car:
b<- (1:3)
df<-data.frame(b)
car=0
Then I run the same loop only for the index j and I obtain the dataframe that I want (one column that indicates j and one column for the different values obtained for car) in the subsequent way:
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)
}
The same method do not function with i and j indexes together. I hope that someone will give me sone hint to solve the problem.
答案1
得分: 4
在循环中处理两个索引可能有点不方便,尤其是当你不需要数组输出时。使用expand.grid()
创建的组合,结合使用Map()
可能会更容易。同时,你可以切换到使用更有信息性的名称:
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
请注意,我已经保留了代码部分的原文,只翻译了注释和字符串部分。
英文:
Having to deal with two indices in loops can be a bit inconvenient,
especially since you’re not after array output. It might be easier to use
Map()
with the combinations created with expand.grid()
. At the same time
you can swap to using more informative names:
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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论