2012-12-06 60 views
7

Tôi đã có danh sách các thống kê khởi động từ một hàm mà tôi đã viết trong R. Danh sách chính có 1000 lần lặp khởi động. Mỗi phần tử trong danh sách chính nó là một danh sách gồm ba điều, bao gồm các giá trị được trang bị cho mỗi trong bốn biến ("fvboot" - ma trận 501x4).Tạo một vector từ các phần tử danh sách trong R

Tôi muốn tạo một vectơ các giá trị cho mỗi vị trí trên lưới của giá trị x, từ 1: 501 và cho mỗi biến, từ 1: 4.

Ví dụ, đối với điểm thứ i trên xgrid của biến thứ j, tôi muốn thực hiện một vector như sau:

 vec = bootfits$fvboot[[1:1000]][i,j] 

nhưng khi tôi làm điều này, tôi nhận được:

recursive indexing failed at level 2 

googling xung quanh, tôi nghĩ rằng tôi hiểu lý do tại sao R đang làm điều này. nhưng tôi không nhận được câu trả lời cho cách tôi có thể lấy phần tử ijth của mỗi ma trận fvboot vào một vector 1000x1.

trợ giúp sẽ được nhiều người đánh giá cao.

+0

'chiều dài (bootfits) 'là gì? Nếu nó là 3 thì đoạn đầu tiên của bạn hoàn toàn gây hiểu nhầm. Nếu nó là 1000, thì bạn không thể làm 'bootfits $ fvboot'. – flodel

Trả lời

4

Điều này sẽ dễ dàng hơn nếu bạn đưa ra một đối tượng ví dụ tối thiểu. Nói chung, bạn không thể lập chỉ mục danh sách với các vectơ như [[1:1000]]. Tôi sẽ sử dụng các hàm plyr. Điều này sẽ làm điều đó (mặc dù tôi đã không kiểm tra nó):

require("plyr") 
laply(bootfits$fvboot,function(l) l[i,j]) 

Nếu bạn không quen thuộc với plyr: Tôi luôn luôn tìm thấy Hadley Wickham của bài viết 'The split-apply-combine strategy for data analysis' rất hữu ích.

+0

với việc thêm unlist(), hoạt động tốt, cảm ơn! –

1

Bạn có thể trích xuất một véc tơ tại một thời điểm bằng cách sử dụng một cách thuận tiện, ví dụ: cho i = 1 và j = 1:

i <- 1 
j <- 1 
vec <- sapply(bootfits, function(x){x$fvboot[i,j]}) 

sapply thực hiện chức năng (trong trường hợp này một hàm nội tuyến, chúng tôi đã viết) cho mỗi yếu tố của bootfits danh sách, và đơn giản hóa kết quả nếu có thể (tức là chuyển đổi nó từ một danh sách đến một vectơ).

Để giải nén một tập hợp toàn bộ các giá trị như một ma trận (ví dụ như trên tất cả các của tôi), bạn có thể bọc này trong sapply khác, nhưng lần này so với của tôi cho một j quy định:

j <- 1 
mymatrix <- sapply(1:501, function(i){ 
    sapply(bootfits, function(x){x$fvboot[i,j]}) 
}) 

Cảnh báo: Tôi chưa thử nghiệm mã này nhưng tôi nghĩ nó nên hoạt động.

4

Sử dụng không công khai() chức năng trong R. Từ example(unlist),

unlist(options()) 
unlist(options(), use.names = FALSE) 

l.ex <- list(a = list(1:5, LETTERS[1:5]), b = "Z", c = NA) 
unlist(l.ex, recursive = FALSE) 
unlist(l.ex, recursive = TRUE) 

l1 <- list(a = "a", b = 2, c = pi+2i) 
unlist(l1) # a character vector 
l2 <- list(a = "a", b = as.name("b"), c = pi+2i) 
unlist(l2) # remains a list 

ll <- list(as.name("sinc"), quote(a + b), 1:10, letters, expression(1+x)) 
utils::str(ll) 
for(x in ll) 
    stopifnot(identical(x, unlist(x))) 
Các vấn đề liên quan