【问题标题】:R append data frames in a nested for loopR在嵌套的for循环中附加数据帧
【发布时间】: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 - 我已经编辑了我的原始帖子。随机数实际上并没有什么区别,它们只是在我的示例中用于将某些内容放入列表元素中。但是,我在底部添加了一个表格,显示了我想要的输出。

标签: r loops nested append


【解决方案1】:

尼基,

这是一个解决方案,希望能回答您的问题。您可以使用在 R 基础中实现的 expand.grid() 函数。这将允许您在输出中包含您感兴趣的所有可能组合的表格。由此,您可以遍历可能的组合数量,并且您一定不会错过任何组合。下面的虚拟示例允许您总结每种可能组合的所有参数。

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

输出表的行数和可能的组合数。然后,您只需循环遍历每一行,并通过将它们存储在同一个表中来进行您喜欢的计算。

for(i in 1:nrow(output)){
  output$result[i] <- sum(output[i,1:2])
}

这能回答你的问题吗?

【讨论】:

  • 这将有助于实现我想要做的 - 谢谢。
猜你喜欢
  • 2015-04-05
  • 1970-01-01
  • 2016-12-19
  • 2021-10-18
  • 2017-10-21
  • 2016-01-31
  • 2021-10-27
  • 2019-02-22
  • 2023-03-23
相关资源
最近更新 更多