如何动态命名变量?


96

是否可以即时创建新的变量名?

我想将列表中的数据帧读入结尾为数字的新变量中。诸如orca1,orca2,orca3之类的东西...

如果我尝试类似

paste("orca",i,sep="")=list_name[[i]]

我得到这个错误

target of assignment expands to non-language object

还有其他解决方法吗?


10
只要我们给出r-faq标签,就让我们给出链接(FAQ 7.21:cran.r-project.org/doc/FAQ/…
Ben Bolker

Answers:


118

用途assign

assign(paste("orca", i, sep = ""), list_name[[i]])

28
这是怎么做的。这里有一个元问题,即“我应该这样做吗?” 答案几乎总是“不”。列表中的命名元素几乎总是首选。
阿里·弗里德曼

26
除非不是,否则答案几乎总是“不”。
Shane 2012年

9
嗯,当然。但是大多数寻求此答案的人并不是从拒绝其申请表的角度出发。
阿里·弗里德曼

@Ari B. Friedman我为保存在mypackage / data中的数据集生成变量名。文件中的每个文件都具有与文件及其中的数据相同的名称(针对包中的数据提供了R建议)。每个数据集约为10M,总数约为17Go。
cmbarbu

3
有什么原因使您不使用paste0
BroVic

33

在我看来,你可能会更好用列表,而不是使用orca1orca2等等......那将是orca[1]orca[2]...

通常,您要创建一个变量列表,除以数字外没有其他任何区别,因为该数字是以后访问它们的便捷方法。

orca <- list()
orca[1] <- "Hi"
orca[2] <- 59

否则,assign这就是您想要的。


11
我同意。通常,当人们认为自己想动态命名变量时,他们真正想要的是不同的数据结构。
Michael Dunn 2010年

9
+1(FAQ 7.21:cran.r-project.org/doc/FAQ/...)讨论了这个很好的
奔Bolker

11

不要制作数据框。保留列表,命名其元素,但不附加。

这样做的最大原因是,如果您随时随地进行变量制作,几乎以后总是需要遍历每个变量来执行有用的操作。在那里,您将再次被迫遍历动态创建的每个名称。

命名列表的元素并遍历名称要容易得多。

就attach而言,它在R中的编程实践确实很差,如果不小心,可能会导致很多麻烦。


因此,仅在完成列表遍历之后,才执行附加操作?
Mox

4

常见问题解答说:

如果你有

varname <- c("a", "b", "d")

你可以做

get(varname[1]) + 2

对于

a + 2

要么

assign(varname[1], 2 + 2)

对于

a <- 2 + 2

因此,当您要评估使用变量(例如连接变量)的公式时,似乎要使用GET;而要为预声明的变量分配值时,则要使用ASSIGN。

分配语法: assign(x,value)

x:变量名,以字符串形式给出。没有强制转换,长度大于1的字符向量的第一个元素将被使用,并带有警告。

值:要分配给x的值。


0

另一个棘手的解决方案是命名list的元素及其attach

list_name = list(
    head(iris),
    head(swiss),
    head(airquality)
    )

names(list_name) <- paste("orca", seq_along(list_name), sep="")
attach(list_name)

orca1
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa
# 3          4.7         3.2          1.3         0.2  setosa
# 4          4.6         3.1          1.5         0.2  setosa
# 5          5.0         3.6          1.4         0.2  setosa
# 6          5.4         3.9          1.7         0.4  setosa

14
棘手,但不明智。如果答案是attach您通常是在问一个错误的问题……
Ben Bolker

-1

和这个选项?

list_name<-list()
for(i in 1:100){
    paste("orca",i,sep="")->list_name[[i]]
}

完美运作。在您放置的示例中,缺少第一行,然后给出了错误消息。


3
这没有解决OP的问题。我们有dataframes名单,我们希望把它分配给dataframes,命名为orca1,ORCA2等
zx8754

“ List with dataframes” =“列表OF dataframes”?
Mox
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.