2011-10-09 33 views
7

Tôi gặp sự cố khi tạo danh sách mô hình. mô hình Giả sử tôi đã tạo:Gắn các mô hình vào danh sách

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

Nếu tôi tạo danh sách thẳng, đó là OK:

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

Nhưng nếu tôi đang cố gắng để thêm mô hình để đã tạo danh sách, mô hình thay đổi lớp học của họ vào data.frame:

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

Lý do của hành vi này là gì và làm cách nào để nối thêm mô hình vào danh sách?

Trả lời

4

Chức năng append được sử dụng để thêm các phần tử vào vectơ.

Để thêm thành phần vào danh sách, hãy sử dụng list. Hãy thử:

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" 

Bây giờ bạn sẽ có một danh sách lm đối tượng:

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

Để thêm vào một danh sách hiện có, sử dụng list như sau:

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

Đằng sau hiện trường, nối thêm chỉ cần làm việc bằng cách sử dụng c (chỉ cần nhập append và nhập vào dòng lệnh để xem mã nguồn của nó). Nếu bạn kiểm tra sự giúp đỡ cho c, bạn sẽ tìm thấy những điều thú vị trong các ví dụ ở đó (kiểm tra phần "không sử dụng").

Tôi nhớ điều này từ một câu hỏi gần đây khác, hoặc có lẽ nó gần đây đã được trên R chat, nhưng không thể nhớ nó là gì, vì vậy nếu ai đó có thể trỏ đến nó?

Trong mọi trường hợp, cho những gì bạn muốn:

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

hoặc nếu bạn nhấn mạnh vào việc sử dụng append:

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

Andrie của giải pháp:

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

không hoạt động vì kết quả là số list với listlm thành phần:

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

bạn cần phải thêm một list đến một list sử dụng c để có được những hành vi mong muốn:

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" 
Các vấn đề liên quan