R在嵌套的for循环中附加数据帧
R append data frames in a nested for loop
我正在尝试 运行 在嵌套的 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)
这是我希望输出的样子(只显示输出的头部):
流域
面积
计算
varA
变量B
varC
varD
奥卡罗
21000
25245
1
1
1
1
罗托马哈纳
23400
434
1
1
1
1
塔拉威拉
26800
231
1
1
1
1
奥卡罗
21000
25245
2
1
1
1
罗托马哈纳
23400
434
2
1
1
1
塔拉威拉
26800
231
2
1
1
1
奥卡罗
21000
25245
3
1
1
1
罗托马哈纳
23400
434
3
1
1
1
塔拉威拉
26800
231
3
1
1
1
奥卡罗
21000
25245
1
2
1
1
罗托马哈纳
23400
434
1
2
1
1
塔拉威拉
26800
231
1
2
1
1
奥卡罗
21000
25245
2
2
1
1
罗托马哈纳
23400
434
2
2
1
1
塔拉威拉
26800
231
2
2
1
1
奥卡罗
21000
25245
3
2
1
1
罗托马哈纳
23400
434
3
2
1
1
塔拉威拉
26800
231
3
2
1
1
奥卡罗
21000
25245
1
1
2
1
罗托马哈纳
23400
434
1
1
2
1
塔拉威拉
26800
231
1
1
2
1
妮琪,
这是一个解决方案,希望能回答您的问题。您可以使用 R base 中实现的 expand.grid() 函数。这将允许您在输出 table 中包含您感兴趣的所有可能组合。由此,您可以遍历可能组合的数量,并且您一定不会错过任何组合。下面的虚拟示例允许您总结每个可能组合的所有参数。
my_list <- list(A=c(1,2,3),B=c(4,5))
output <- as.data.frame(expand.grid(my_list))
output$result <- NA #new variable to store your calculus
输出 table 的行数为可能的组合数。然后你只需要循环遍历每一行并通过将它们存储在同一个 table 中来进行你喜欢的计算。例如。
for(i in 1:nrow(output)){
output$result[i] <- sum(output[i,1:2])
}
这是否回答了您的问题?
我正在尝试 运行 在嵌套的 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)
这是我希望输出的样子(只显示输出的头部):
流域 | 面积 | 计算 | varA | 变量B | varC | varD |
---|---|---|---|---|---|---|
奥卡罗 | 21000 | 25245 | 1 | 1 | 1 | 1 |
罗托马哈纳 | 23400 | 434 | 1 | 1 | 1 | 1 |
塔拉威拉 | 26800 | 231 | 1 | 1 | 1 | 1 |
奥卡罗 | 21000 | 25245 | 2 | 1 | 1 | 1 |
罗托马哈纳 | 23400 | 434 | 2 | 1 | 1 | 1 |
塔拉威拉 | 26800 | 231 | 2 | 1 | 1 | 1 |
奥卡罗 | 21000 | 25245 | 3 | 1 | 1 | 1 |
罗托马哈纳 | 23400 | 434 | 3 | 1 | 1 | 1 |
塔拉威拉 | 26800 | 231 | 3 | 1 | 1 | 1 |
奥卡罗 | 21000 | 25245 | 1 | 2 | 1 | 1 |
罗托马哈纳 | 23400 | 434 | 1 | 2 | 1 | 1 |
塔拉威拉 | 26800 | 231 | 1 | 2 | 1 | 1 |
奥卡罗 | 21000 | 25245 | 2 | 2 | 1 | 1 |
罗托马哈纳 | 23400 | 434 | 2 | 2 | 1 | 1 |
塔拉威拉 | 26800 | 231 | 2 | 2 | 1 | 1 |
奥卡罗 | 21000 | 25245 | 3 | 2 | 1 | 1 |
罗托马哈纳 | 23400 | 434 | 3 | 2 | 1 | 1 |
塔拉威拉 | 26800 | 231 | 3 | 2 | 1 | 1 |
奥卡罗 | 21000 | 25245 | 1 | 1 | 2 | 1 |
罗托马哈纳 | 23400 | 434 | 1 | 1 | 2 | 1 |
塔拉威拉 | 26800 | 231 | 1 | 1 | 2 | 1 |
妮琪,
这是一个解决方案,希望能回答您的问题。您可以使用 R base 中实现的 expand.grid() 函数。这将允许您在输出 table 中包含您感兴趣的所有可能组合。由此,您可以遍历可能组合的数量,并且您一定不会错过任何组合。下面的虚拟示例允许您总结每个可能组合的所有参数。
my_list <- list(A=c(1,2,3),B=c(4,5))
output <- as.data.frame(expand.grid(my_list))
output$result <- NA #new variable to store your calculus
输出 table 的行数为可能的组合数。然后你只需要循环遍历每一行并通过将它们存储在同一个 table 中来进行你喜欢的计算。例如。
for(i in 1:nrow(output)){
output$result[i] <- sum(output[i,1:2])
}
这是否回答了您的问题?