2011-10-09 12 views
7

Ho problemi con la creazione di lista dei modelli. modello Supponiamo che io ho creato:modelli aggiungendoli alla lista

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

Se sto creando lista retta, questo è OK:

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

Ma se sto cercando di aggiungere al modello già creato la lista, modelli cambiando la loro classe a data.frame:

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

Qual è un motivo di questo comportamento e come posso aggiungere un modello all'elenco?

risposta

4

La funzione append viene utilizzata per aggiungere elementi a un vettore.

per aggiungere elementi a un elenco, utilizzare list. Prova:

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" 

Ora dovreste avere una lista di lm oggetti:

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

da aggiungere a un elenco esistente, utilizzare list come segue:

x <- list(fit1) 
x <- list(x, fit2) 
2

Dietro la scena, aggiungere semplicemente funziona utilizzando c (basta digitare append e immettere nella riga di comando per vedere il suo codice sorgente). Se si seleziona l'aiuto per c, troverete cose interessanti negli esempi là (controllare la parte "non usare").

Lo ricordo da una recente altra domanda, o forse è stato di recente in chat R, ma non ricordo quale fosse, quindi se qualcun altro può indicarlo?

In ogni caso, per ciò che si vuole:

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

o se ti ostini a usare append:

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

soluzione Andrie:

x <- list(fit1) 
x <- list(x, fit2) 

non funziona perché si traduce in un list con list e lm componenti:

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

è necessario aggiungere un list ad un list utilizzando c per ottenere il comportamento desiderato:

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"