如何动态命名变量?

时间:2010-04-20 22:38:26

标签: r assign r-faq

是否可以动态创建新的变量名称?

我想将列表中的数据帧读入最后带数字的新变量。像orca1,orca2,orca3 ......

如果我尝试类似

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

我收到此错误

target of assignment expands to non-language object

还有另外一种解决方法吗?

6 个答案:

答案 0 :(得分:107)

使用assign

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

答案 1 :(得分:32)

在我看来,您可能会更好地使用列表而不是使用orca1orca2等,然后它会orca[1],{{1} },...

通常你要制作一个变量列表,除了数字之外什么都不区分,因为这个数字是以后访问它们的便捷方式。

orca[2]

否则,orca <- list() orca[1] <- "Hi" orca[2] <- 59 就是你想要的。

答案 2 :(得分:9)

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

这样做的最大原因是,如果你在旅途中制作变量,你几乎总是会不得不迭代它们中的每一个来执行一些有用的事情。在那里,您将再次被迫迭代您在运行中创建的每个名称。

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

就附件而言,它在R中的编程实践非常糟糕,如果你不小心会导致很多麻烦。

答案 3 :(得分:2)

FAQ says:

如果你有

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的值。

答案 4 :(得分:0)

另一个棘手的解决方案是命名列表元素和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

答案 5 :(得分:-2)

这个选项?

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

完美无缺。在您放置的示例中,缺少第一行,然后为您提供错误消息。