2015-07-22 38 views
11

Tôi biết chủ đề này xuất hiện trên SO một vài lần, nhưng các ví dụ thường phức tạp hơn và tôi muốn có câu trả lời (hoặc tập hợp các giải pháp khả thi) cho tình huống đơn giản này. Tôi vẫn quấn đầu quanh R và lập trình nói chung. Vì vậy, ở đây tôi muốn sử dụng chức năng lapply hoặc vòng lặp đơn giản tới danh sách data là danh sách ba danh sách vectơ.Lapply function/loops trong danh sách các danh sách R

data1 <- list(rnorm(100),rnorm(100),rnorm(100)) 
data2 <- list(rnorm(100),rnorm(100),rnorm(100)) 
data3 <- list(rnorm(100),rnorm(100),rnorm(100)) 

data <- list(data1,data2,data3) 

Bây giờ, tôi muốn lấy danh sách phương tiện cho mỗi véc tơ. Kết quả sẽ là danh sách gồm ba phần tử (danh sách).

tôi chỉ biết làm thế nào để có được danh sách các kết quả cho một danh sách các vectơ và

for (i in 1:length(data1)){ 
     means <- lapply(data1,mean) 
} 

hoặc bằng cách:

lapply(data1,mean)

và tôi biết làm thế nào để có được tất cả các phương tiện sử dụng rapply:

rapply(data,mean)

Vấn đề là rapply không duy trì cấu trúc danh sách. Trợ giúp và có thể một số mẹo/giải thích sẽ được nhiều người đánh giá cao.

Trả lời

28

Chúng ta có thể lặp qua danh sách các danh sách với một lồng nhau lapply/sapply

lapply(data, sapply, mean) 

Đó là nếu không viết như

lapply(data, function(x) sapply(x, mean)) 

Hoặc nếu bạn cần đầu ra với cấu trúc list, một lồng nhau lapply thể được sử dụng

lapply(data, lapply, mean) 

Hoặc với rapply, chúng tôi có thể sử dụng đối số how để có được loại kết quả mong muốn.

rapply(data, mean, how='list') 

Nếu chúng tôi đang sử dụng vòng lặp for, chúng tôi có thể cần tạo đối tượng để lưu trữ kết quả.

res <- vector('list', length(data)) 
    for(i in seq_along(data)){ 
    for(j in seq_along(data[[i]])){ 
     res[[i]][[j]] <- mean(data[[i]][[j]]) 
    } 
    } 
+0

wow, điều này thật tuyệt vời (và bằng cách nào đó hoàn toàn không trực quan với tôi, vì tôi đã học được các vòng truyền thống trước). chỉ để nắm bắt được ý tưởng đó, liệu bạn có thể thấy nó trông như thế nào trong truyền thống cho vòng lặp? điều đó sẽ giúp tôi có được ý tưởng về cấu trúc lập chỉ mục trong trường hợp tôi cần áp dụng một số chức năng phức tạp hơn – MIH

+1

Cập nhật bài đăng – akrun

+0

cảm ơn rất nhiều, giúp đỡ rất nhiều! – MIH

Các vấn đề liên quan