【发布时间】:2019-07-06 00:13:48
【问题描述】:
我正在从一个循环遍历它们的文件夹中打开一个 netcdf 文件列表:
nfiles <- 10
datL <- list.files(/home/myname/filedir/,pattern='*nc')
for (i in 1:nfiles){
dat = nc_open(datL[[i]])
要提取变量并将它们的名称保留在 netcdf 文件中,我会这样做:
allvars <- as.list(names(dat[['var']]))
for (k in 1:length(unlist(allvars)) ) {
assign(allvars[[k]],ncvar_get(dat(allvars[[k]])) } }
所有文件每个都有大约 50 个变量,但大多数文件具有相同的变量名。
我想做但无法解决的问题是如何在变量命名中保留列表编号。因此,例如,假设在 netcdf 文件中,有一个名为 rain 的变量,assign(allvars[[k]]) 将简单地分配名称 rain。相反,我想要的是将变量名称分配给列表编号,使其为rain[[i]]。 assign(paste0(allvars[[k]],as.list(i)),ncvar_get...etc) 将变量写为 rain1,rain2 但我更喜欢 [[ 格式。
【问题讨论】:
-
您可以将其保存在向量中,而不是
listing 和unlisting。allvars <- paste0(names(dat[['var']]), rain); for(k in seq_along(all_vars)) assign(allvars[k], ... -
@akrun 我不认为这符合我的要求。我已经编辑了问题以试图更清楚。
-
忘记
assign。这是专家的功能,初学者不要滥用。只需将所有这些变量放在一个列表中,例如,L <- list(); L[[allvars[k]]] <- ...。 -
@Roland 谢谢。它仍然不能满足我的要求,但我可以使用它。我需要变量名来保留 nfiles 上的循环列表号。通过修改您的建议(例如
L <-list(); for (i in 1:nfiles){ L[[i]] <- list() ; ... ; L[[i]][[allvars[[k]]]] <- ncvar_get...),保留列表编号以便我获得L[[i]]$rain,而不是rain[[i]],这会更简单