我有一个数据框列表,其中包含一些时间序列预测的结果,每个数据框都有一个名称:
list.of.results <- list(modelA, modelB, modelC)
现在,我循环遍历列表并对每个模型的结果执行一些测试,但是我需要将数据帧的名称提取为我当前正在循环的字符串。
这让我得到一个空白:
names(list.of.results)
> NULL
任何想法如何做到这一点?感谢
答案 0 :(得分:2)
重新提出问题,目标是创建一个列表,其中列表元素根据已分配的对象具有名称。如果a
被分配给第一个列表元素,则第一个名称应自动变为a
。
可以使用makeNamedList
代替list
来实现。函数makeNamedList
是this question的精简结果。
makeNamedList <- function(...) {
structure(list(...), names = as.list(substitute(list(...)))[-1L])
}
示例:
mylist <- makeNamedList(cars, iris)
str(mylist)
# List of 2
# $ cars:'data.frame': 50 obs. of 2 variables:
# ..$ speed: num [1:50] 4 4 7 7 8 9 10 10 10 11 ...
# ..$ dist : num [1:50] 2 10 4 22 16 10 18 26 34 17 ...
# $ iris:'data.frame': 150 obs. of 5 variables:
# ..$ Sepal.Length: num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
# ..$ Sepal.Width : num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
# ..$ Petal.Length: num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
# ..$ Petal.Width : num [1:150] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
# ..$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
因此makeNamedList(cars, iris)
相当于list(cars = cars, iris = iris)
。
答案 1 :(得分:1)
mget
是一个选项:
x <- 1
y <- 2
mget(c("x", "y"))
#$x
#[1] 1
#
#$y
#[1] 2
但是,最好的解决方案是在创建对象时将它们放入列表中。
答案 2 :(得分:0)
您必须在创建列表时指定名称
首先在创建列表后指定名称
names(list.of.results) <- c("modelA","modelB","modelC")
编辑:您可以搜索环境中的所有模型并指定名称
names(list.of.results) <- ls(pattern = "model")
然后您可以将名称称为
names(list.of.results)[1]