是否可以动态创建新的变量名称?
我想将列表中的数据帧读入最后带数字的新变量。像orca1,orca2,orca3 ......
如果我尝试类似
的话paste("orca",i,sep="")=list_name[[i]]
我收到此错误
target of assignment expands to non-language object
还有另外一种解决方法吗?
答案 0 :(得分:107)
使用assign
:
assign(paste("orca", i, sep = ""), list_name[[i]])
答案 1 :(得分:32)
在我看来,您可能会更好地使用列表而不是使用orca1
,orca2
等,然后它会orca[1]
,{{1} },...
通常你要制作一个变量列表,除了数字之外什么都不区分,因为这个数字是以后访问它们的便捷方式。
orca[2]
否则,orca <- list()
orca[1] <- "Hi"
orca[2] <- 59
就是你想要的。
答案 2 :(得分:9)
不要制作数据框。保留列表,命名其元素,但不要附加它。
这样做的最大原因是,如果你在旅途中制作变量,你几乎总是会不得不迭代它们中的每一个来执行一些有用的事情。在那里,您将再次被迫迭代您在运行中创建的每个名称。
命名列表的元素并遍历名称要容易得多。
就附件而言,它在R中的编程实践非常糟糕,如果你不小心会导致很多麻烦。
答案 3 :(得分:2)
如果你有
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]]
}
完美无缺。在您放置的示例中,缺少第一行,然后为您提供错误消息。