2011-10-09 58 views
7

我在创建模型列表时遇到了问题。 假设我已经创建模型:将模型添加到列表

> rp <- rpart(V41 ~ ., data=learnData, method="class") 

如果我创建列表直,那OK:

> ll <- list(rp, rp, rp) 
> class(ll[[1]]) 
[1] "rpart" 
> class(ll[[2]]) 
[1] "rpart" 
> class(ll[[3]]) 
[1] "rpart" 

但是,如果我试图追加模型已经创建的列表, 模式改变他们的类data.frame:

> ll <- list(rp) 
> ll <- append(ll, rp) 
> class(ll[[1]]) 
[1] "rpart" 
> class(ll[[2]]) 
[1] "data.frame" 

这种行为是什么原因,我怎样才能追加模型列表?

回答

4

函数append用于向元素添加元素。

要将元素添加到列表中,请使用list。尝试:

fit1 <- lm(Sepal.Length ~ Sepal.Width, data=iris) 
fit2 <- lm(Sepal.Length ~ Petal.Width, data=iris) 

x <- list(fit1, fit2) 
str(x, max.level=1) 

List of 2 
$ :List of 12 
    ..- attr(*, "class")= chr "lm" 
$ :List of 12 
    ..- attr(*, "class")= chr "lm" 

你现在应该有lm对象的列表:

> class(x[[1]]) 
[1] "lm" 

要附加到现有列表,使用list如下:

​​
2

幕后,追加只需使用c即可(只需键入append并在命令行中输入以查看其源代码)。如果你检查c的帮助,你会在那里找到有趣的东西(检查“不要使用”部分)。

我记得最近的一个其他问题,或者最近在R聊天,但不记得它是什么,所以如果别人可以指出它呢?

在任何情况下,你想要的东西:

ll<-c(ll, list(rp)) 

,或者如果你坚持要用append

ll<-append(ll, list(rp)) 
6

Andrie的解决方案:

​​

不会因为工作它会导致listlistlm个组件:

sapply(x,class) 
# [1] "list" "lm" 

需要追加listlist使用c以获得所需的行为:

x <- list(fit1) 
x <- c(x, list(fit2)) 
sapply(x,class) 
# [1] "lm" "lm" 
x <- c(x, list(fit3)) 
sapply(x,class) 
# [1] "lm" "lm" "lm"