在具有不同变量名称的循环中保存

Posted

技术标签:

【中文标题】在具有不同变量名称的循环中保存【英文标题】:Saving whitin a loop with different variable names 【发布时间】:2015-02-01 15:26:12 【问题描述】:

我有一个函数,它使用数据帧列表 (variables) 并提供两个数据帧(对于列表中的每个数据帧)作为输出,我想用不同的变量名保存每个数据帧(而不是up.valdown.val) 和不同的文件名。我存储在我创建的字符向量上的变量和文件名。

  filtering_data <- function(x)

  x <- as.data.frame(x)
  pval <- which(x$P.Value < 0.05)
  pval <- x[pval,]


  up.pval <- which(pval$t > 0)
  down.pval <- which(pval$t < 0)

  up.pval <- pval[up.pval,]
  down.pval <- pval[down.pval,]

  save(up.pval, file = file.Rda)
  save(down.pval, file =  file.Rda )
  

lapply(variables, filtering_data)

【问题讨论】:

附带说明,我不建议您将函数命名为 filter,因为在 stats 命名空间中已经有一个基本 R 函数 filter 谢谢,我改一下函数名。 【参考方案1】:

我认为您想使用assign 将值分配给新名称,然后将变量名称作为list 参数提供给save。如:

filtering_data <- function(x,varName,file.rda) 

    [calculations go here]]

    # assign() only assigns one value so check the length of varName
    stopifnot(length(varName)==1)

    # make the new variable names
    name.up <- paste0(varName,'.','up')
    name.down <- paste0(varName,'.','down')

    # assign the values to them in the current environment
    assign(name.up,up.pval)
    assign(name.down,down.pval)

    # save the named variables
    save(list=name.up,  file=file.rda)
    save(list=name.down,file=file.rda)

顺便说一句,file.rda 应该是一个参数,而不是假设它已经定义了

【讨论】:

不工作。如果我向函数添加更多变量,例如varName,它会返回类似Error en pval$t : $ operator is invalid for atomic vectors 的内容。如果我添加 las 四行代码,我会收到如下错误:Error en save(list = up_varNames, file = file.Rda) : objects ‘top_k1.up’, ‘top_k2.up’, ‘top_Na1.up’, ‘top_Na2.up’, ‘top_ox.up’, ‘top_ter.up’, ‘top_ypd.up’ not found Message of lost 1: In assign(up_varNames, up.pval) : just the first element is used as name of a variable 其他分配行相同。 那是因为assign只给当前环境分配了一个变量。您将不得不遍历变量名 (for(i in seq_along(name.up)) assign(name.up[i],up.pval[i]) ). That is why you are getting the error message from save`. 关于pval$t 的错误告诉您pval 是一个原子向量(可能是数字;您可以使用class(pval) 找出答案)。由于您的帖子中没有定义t,因此我无法知道t 是什么以及您使用它的原因。在任何情况下,都没有为向量定义 $ 运算符。也许你想要pval[t] 好的,知道我得到了两个文件(.Rda),(我得到了两个,因为我把所有这些都保存在两个文件中,up.Rda 和 down.Rda 以便更容易),但是每个文件都有 8 个数据框(这个数字没问题),但都是一样的(就像列表的 las 数据框)。所以我猜这是由于函数内的循环方式。 tP.Value 是我用来过滤我想要的信息的数据框的列。

以上是关于在具有不同变量名称的循环中保存的主要内容,如果未能解决你的问题,请参考以下文章

使用字典和数据框通过循环创建具有变量名的新数组

如何在 shell 脚本中动态生成新的变量名?

命名工作区变量并将其保存到名称中更改数字的文件中 - Matlab

如何在 C 中取消设置变量以允许稍后使用具有不同数据类型的相同名称?

在 for 循环中保存动态命名的变量

js冲突怎么解决