我正在编写一个包含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)
答案 0 :(得分:0)
听起来你正在尝试创建一个名称为&#34; layer_2&#34;,&#34; layer_3&#34;,...的列表,其中包含来自{{的列名的空数据框1}}变量。您可以使用calcs
和replicate
:
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方法,但我无法弄清楚如何将这些数据帧存储在列表中,而实际上并不知道有多少层。这篇文章给了我最多的帮助: