2011-10-09 27 views
7

Tengo un problema al crear la lista de modelos. modelo Supongamos que he creado:Agregar modelos a la lista

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

Si estoy lista creación recta, eso es bueno:

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

Pero si yo estoy tratando de añadir a la lista de modelo ya creado, modelos cambiantes su clase a data.frame:

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

¿Cuál es la razón de este comportamiento y cómo puedo agregar el modelo a la lista?

Respuesta

4

La función append se usa para agregar elementos a un vector.

Para agregar elementos a una lista, use list. Proveedores:

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" 

Ahora debe tener una lista de lm objetos:

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

para añadir a una lista existente, utilice list de la siguiente manera:

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

Detrás de la escena, anexar simplemente funciona usando c (simplemente escriba append e ingrese en la línea de comando para ver su código fuente). Si revisa la ayuda para c, encontrará ejemplos interesantes en los ejemplos allí (marque la parte "no usar").

Recuerdo esto de una pregunta reciente, o tal vez fue recientemente en R chat, pero no recuerdo cuál era, por lo que si alguien más puede señalarlo?

En cualquier caso, por lo que quiere:

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

o si usted insiste en el uso de append:

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

solución de Andrie:

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

no funciona porque resulta en un list con list y lm componentes:

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

que necesitan para añadir un list a un listc utilizando para obtener el comportamiento deseado:

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" 
Cuestiones relacionadas