【发布时间】:2021-10-03 00:01:35
【问题描述】:
我正在尝试在嵌套的 for 循环中运行一些计算,并将每个结果记录在数据框中。我希望循环遍历每个可能的变量组合,并将一行附加到数据帧。到目前为止,这是我尝试过的,它让我成功了,但并不是所有的迭代都被记录下来。任何想法如何做到这一点?
set.seed(7)
library(dplyr)
list_pts <- list(rnorm(5), rnorm(5), rnorm(5))
list_PET <- list(rnorm(5), rnorm(5))
list_GWpts <- list(rnorm(5), rnorm(5), rnorm(5))
list_Rain <- list(rnorm(5), rnorm(5), rnorm(5))
datalist1 <- list()
datalist2 <- list()
datalist3 <- list()
datalist4 <- list()
for (z in 1:3) { # loop for varying pts
pts <- list_pts[[z]]
pts_used <- z
for (f in 1:2){ # loop for varying PET
PET <- list_PET[[f]]
PET_used <- f
for (y in 1:3) { # loop for varying GW pts
GWpts <- list_GWpts[[y]]
GWpts_used <- y
for (u in 1:3) { # loop for varying rain dataset
RAIN <- list_Rain[[u]] #
rain_used <- u
##### Do some calculations using input variables in lists (not shown)
catchment <- c('Okaro','Rotomahana','Tarawera')
area <- c(21000, 23400, 26800)
calc <- c(25245, 434, 231)
output <- data.frame(catchment, area, calc)
########
output$varA <- pts_used
output$varB <- PET_used
output$varC <- GWpts_used
output$varD <- rain_used
datalist1[[u]] <- output
}
big_data1 <- dplyr::bind_rows(datalist1)
datalist2[[y]] <- output
}
big_data2 <- dplyr::bind_rows(datalist2)
datalist3[[f]] <- output
}
big_data3 <- dplyr::bind_rows(datalist3)
datalist4[[z]] <- output
}
big_data4 <- dplyr::bind_rows(datalist4)
big_data_all <- dplyr::bind_rows(datalist1, datalist2, datalist3, datalist4)
这就是我希望我的输出看起来的样子(只显示输出的头部):
| catchment | area | calc | varA | varB | varC | varD |
|---|---|---|---|---|---|---|
| Okaro | 21000 | 25245 | 1 | 1 | 1 | 1 |
| Rotomahana | 23400 | 434 | 1 | 1 | 1 | 1 |
| Tarawera | 26800 | 231 | 1 | 1 | 1 | 1 |
| Okaro | 21000 | 25245 | 2 | 1 | 1 | 1 |
| Rotomahana | 23400 | 434 | 2 | 1 | 1 | 1 |
| Tarawera | 26800 | 231 | 2 | 1 | 1 | 1 |
| Okaro | 21000 | 25245 | 3 | 1 | 1 | 1 |
| Rotomahana | 23400 | 434 | 3 | 1 | 1 | 1 |
| Tarawera | 26800 | 231 | 3 | 1 | 1 | 1 |
| Okaro | 21000 | 25245 | 1 | 2 | 1 | 1 |
| Rotomahana | 23400 | 434 | 1 | 2 | 1 | 1 |
| Tarawera | 26800 | 231 | 1 | 2 | 1 | 1 |
| Okaro | 21000 | 25245 | 2 | 2 | 1 | 1 |
| Rotomahana | 23400 | 434 | 2 | 2 | 1 | 1 |
| Tarawera | 26800 | 231 | 2 | 2 | 1 | 1 |
| Okaro | 21000 | 25245 | 3 | 2 | 1 | 1 |
| Rotomahana | 23400 | 434 | 3 | 2 | 1 | 1 |
| Tarawera | 26800 | 231 | 3 | 2 | 1 | 1 |
| Okaro | 21000 | 25245 | 1 | 1 | 2 | 1 |
| Rotomahana | 23400 | 434 | 1 | 1 | 2 | 1 |
| Tarawera | 26800 | 231 | 1 | 1 | 2 | 1 |
【问题讨论】:
-
您好 Nicki,您尝试过使用 expand.grid() 函数吗?如果您提供一个列表作为参数,它将为您提供一个包含您正在寻找的所有组合的数据框。因此,您可以使用 expand.grid() 函数的输出来创建一个简单的循环(通过此输出的行数)并选择存储在其第 i 行的参数。您是否尝试过此选项?
-
您能否使用
set.seed生成随机数据并为其显示预期输出,以便清楚您要达到的目标。 -
Ronak Shah - 我已经编辑了我的原始帖子。随机数实际上并没有什么区别,它们只是在我的示例中用于将某些内容放入列表元素中。但是,我在底部添加了一个表格,显示了我想要的输出。