在具有不同变量名称的循环中保存
Posted
技术标签:
【中文标题】在具有不同变量名称的循环中保存【英文标题】:Saving whitin a loop with different variable names 【发布时间】:2015-02-01 15:26:12 【问题描述】:我有一个函数,它使用数据帧列表 (variables
) 并提供两个数据帧(对于列表中的每个数据帧)作为输出,我想用不同的变量名保存每个数据帧(而不是up.val
和 down.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 数据框)。所以我猜这是由于函数内的循环方式。
t
和 P.Value
是我用来过滤我想要的信息的数据框的列。以上是关于在具有不同变量名称的循环中保存的主要内容,如果未能解决你的问题,请参考以下文章
命名工作区变量并将其保存到名称中更改数字的文件中 - Matlab