我在创建模型列表时遇到问题。 假设我已经创建了模型:
> 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"
这种行为的原因是什么?如何将模型附加到列表?
答案 0 :(得分:6)
Andrie的解决方案:
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"
答案 1 :(得分: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
:
x <- list(fit1)
x <- list(x, fit2)
答案 2 :(得分:2)
在场景后面,追加只是使用c
(只需输入append
并输入命令行查看其源代码)。如果您查看c
的帮助,您会在示例中找到有趣的内容(请查看“请勿使用”部分)。
我从最近的另一个问题中记得这个,或者也许是最近在R聊天,但是不记得它是什么,所以如果其他人可以指出它?
无论如何,为了你想要的:
ll<-c(ll, list(rp))
或者如果您坚持使用append
:
ll<-append(ll, list(rp))