2011-10-09 54 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"