【问题标题】:Assign variable names from list of files keeping list format从保持列表格式的文件列表中分配变量名
【发布时间】: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 &lt;- paste0(names(dat[['var']]), rain); for(k in seq_along(all_vars)) assign(allvars[k], ...
  • @akrun 我不认为这符合我的要求。我已经编辑了问题以试图更清楚。
  • 忘记assign。这是专家的功能,初学者不要滥用。只需将所有这些变量放在一个列表中,例如,L &lt;- list(); L[[allvars[k]]] &lt;- ...
  • @Roland 谢谢。它仍然不能满足我的要求,但我可以使用它。我需要变量名来保留 nfiles 上的循环列表号。通过修改您的建议(例如L &lt;-list(); for (i in 1:nfiles){ L[[i]] &lt;- list() ; ... ; L[[i]][[allvars[[k]]]] &lt;- ncvar_get...),保留列表编号以便我获得L[[i]]$rain,而不是rain[[i]],这会更简单

标签: r list assign


【解决方案1】:

您可以使用list2env() 将命名变量列表分配给全局环境,例如:

l <- list(a = 1, b = 2:4, p = pi, ff = gl(3, 4, labels = LETTERS[1:3]))
list2env(l, .GlobalEnv)
ls()
[1] "a"  "b"  "ff" "l"  "p" 

您还可以看看 R for data science 一书,尤其是关于many models 的部分。它引入了嵌套数据框的概念,可以处理许多相似的子数据集和许多子模型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多