生成n个数据帧并附加到列表

时间:2016-03-17 14:02:10

标签: r

我正在编写一个包含n层的盒子模型。我想为我在盒子模型中定义的每个图层生成一个数据框,并在每个数据框的每一列中执行计算。我使用此代码初始化了数据框:

##Initialize layer energy+water balance dataframes
calcs <- c("Vwin", "Vwout", "Vsin","Vsout","Pistd","Vwnet","Psin","Psout","Vw","Vemax","Sw","Cp","Kt","Qwout","Qtop","Qbot","Qsides","Qnet","Tavg")
layer_tabs<-list()

for(i in 2:(layers-1)){
  nam <- paste("layer_",i,sep = "")
  assign(nam,data.frame(matrix(vector(),t,length(calcs),dimnames = list(c(),calcs))))
  append(layer_tabs, nam=nam)
}

现在,对于在我的计算向量中命名的每个列,我需要在每个图层数据框中执行特定的计算。我想要将生成的层数据帧附加到我可以循环的列表或使用应用函数,然后为每列写入函数/方程式或通过使用变量名中的数字循环数据帧。我尝试将生成的数据框附加到空列表&#34; layer_tabs&#34;返回错误:

Error in append(layer_tabs, nam = nam) : unused argument (nam = nam)

2 个答案:

答案 0 :(得分:0)

听起来你正在尝试创建一个名称为&#34; layer_2&#34;,&#34; layer_3&#34;,...的列表,其中包含来自{{的列名的空数据框1}}变量。您可以使用calcsreplicate

在一行中执行此操作
setNames

数据:

setNames(replicate(layers-2, data.frame(matrix(vector(), nrow=0, ncol=length(calcs),
                                               dimnames = list(c(),calcs))),
                   simplify=FALSE),
         paste0("layer_", 2:(layers-1)))
# $layer_2
#  [1] Vwin   Vwout  Vsin   Vsout  Pistd  Vwnet  Psin   Psout  Vw     Vemax  Sw    
# [12] Cp     Kt     Qwout  Qtop   Qbot   Qsides Qnet   Tavg  
# <0 rows> (or 0-length row.names)
# 
# $layer_3
#  [1] Vwin   Vwout  Vsin   Vsout  Pistd  Vwnet  Psin   Psout  Vw     Vemax  Sw    
# [12] Cp     Kt     Qwout  Qtop   Qbot   Qsides Qnet   Tavg  
# <0 rows> (or 0-length row.names)
# 
# $layer_4
#  [1] Vwin   Vwout  Vsin   Vsout  Pistd  Vwnet  Psin   Psout  Vw     Vemax  Sw    
# [12] Cp     Kt     Qwout  Qtop   Qbot   Qsides Qnet   Tavg  
# <0 rows> (or 0-length row.names)

答案 1 :(得分:0)

我使用以下代码完成了我的尝试:

for(i in 2:(layers-1)){
 nam <- paste("layer_",i,sep = "")
 layer_tabs[[nam]]<-assign(nam,data.frame(t,matrix(data=rep(0,times=length(t)*length(calcs)),nrow=length(t),ncol=(length(calcs)),dimnames = list(c(),calcs))))

}

这允许我为未知数量的层创建数据帧并将它们存储在一个列表中,我可以使用double for循环对每个数据帧中给定变量的所有列进行计算,这将允许我循环通过每个数据框架和时间:

for(i in 1:length(layer_tabs)){
  for(j in 1:length(t)){
    if(j==1){
      #assign initial values
      layer_tabs[[i]]$Sw[j] <- physical_inputs$sat[i+1]
    }
  }
}

这可能不是实现我的目标的最有效方式,但它可以解决问题。谢谢您的意见。我尝试了setNames方法,但我无法弄清楚如何将这些数据帧存储在列表中,而实际上并不知道有多少层。这篇文章给了我最多的帮助:

Adding data frames as list elements (using for loop)