Добавление моделей в список - PullRequest
7 голосов
/ 10 октября 2011

У меня проблема с созданием списка моделей. Предположим, я создал модель:

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

Если я создаю список прямо, это нормально:

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

В чем причина такого поведения и как я могу добавить модель в список?

Ответы [ 3 ]

7 голосов
/ 13 февраля 2014

Решение Андри:

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

не работает, потому что это приводит к list с list и lm компонентами:

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

вам нужно добавить list к list, используя 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"
5 голосов
/ 10 октября 2011

Функция 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 следующим образом:

x <- list(fit1)
x <- list(x, fit2)
2 голосов
/ 10 октября 2011

За сценой, добавление просто работает с помощью c (просто введите append и введите в командной строке, чтобы увидеть его исходный код).Если вы проверите справку для c, вы найдете интересные примеры в примерах (отметьте «не использовать»).

Я помню это из недавнего другого вопроса, или, возможно,недавно в чате R, но не могу вспомнить, что это было, так что, если кто-то еще может указать на это?используя append:

ll<-append(ll, list(rp))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...