2013-07-26 41 views
5

Tôi có danh sách phức tạp bao gồm các danh sách và khung dữ liệu khác. Tôi cần đơn giản hóa danh sách này để chỉ bao gồm các khung dữ liệu - vì vậy mỗi danh sách cấp hai phải được đưa vào các khung dữ liệu cấp đầu tiên riêng biệt.Chuyển danh sách danh sách phức tạp thành danh sách khung dữ liệu

Đây là tái sản xuất ví dụ:

dd<-data.frame(x=1:3,y=4:6) 
l1<-list(dd,list(dd,dd)) 
#original list 
l1 
[[1]] 
    x y 
1 1 4 
2 2 5 
3 3 6 

[[2]] 
[[2]][[1]] 
    x y 
1 1 4 
2 2 5 
3 3 6 

[[2]][[2]] 
    x y 
1 1 4 
2 2 5 
3 3 6 

Result tôi cần để có được

l2<-list(dd,dd,dd) 
l2 
[[1]] 
    x y 
1 1 4 
2 2 5 
3 3 6 

[[2]] 
    x y 
1 1 4 
2 2 5 
3 3 6 

[[3]] 
    x y 
1 1 4 
2 2 5 
3 3 6 

Tôi đã thử với chức năng unlist() và lập luận recursive=FALSE nhưng trong trường hợp đầu tiên khung dữ liệu cấp độ này được chuyển thành hai vectơ .

unlist(l1,recursive=FALSE) 
$x 
[1] 1 2 3 

$y 
[1] 4 5 6 

[[3]] 
    x y 
1 1 4 
2 2 5 
3 3 6 

[[4]] 
    x y 
1 1 4 
2 2 5 
3 3 6 

Trả lời

3

Một cách tôi có thể nghĩ đến là để kiểm tra xem lớp đầu vào (trong khi chạy lapply) là data.frame hoặc list, và nếu đó là một data.frame chuyển nó sang một danh sách các data.frame. Điều này sẽ dẫn đến toàn bộ danh sách trở thành danh sách các danh sách dữ liệu.frames. Sau đó, bạn có thể sử dụng unlist với recursive=FALSE như sau:

unlist(lapply(l1, function(x) 
     if (class(x) == "data.frame") list(x) else x), recursive=FALSE) 
[[1]] 
    x y 
1 1 4 
2 2 5 
3 3 6 

[[2]] 
    x y 
1 1 4 
2 2 5 
3 3 6 

[[3]] 
    x y 
1 1 4 
2 2 5 
3 3 6 

này hoạt động tất nhiên khi dữ liệu như bạn đề cập chính xác. Chúng là danh sách các data.frames hoặc danh sách các data.frames. Oh và chào mừng bạn đến với SO (câu hỏi đầu tiên)! :)

+0

Cảm ơn! Tôi đã suy nghĩ mọi lúc theo hướng ngược lại - cách chia danh sách danh sách. Ý tưởng chuyển đổi khung dữ liệu thành danh sách khung dữ liệu rất tuyệt. –

+0

Tôi sẽ cố gắng tránh 'class (x) ==" data.frame "' và sử dụng 'is.data.frame' để thay thế. – shadow

+0

không chắc chắn vấn đề ở đây là gì để tránh sử dụng nó. bạn có thể xây dựng được không? 'is.data.frame' sử dụng' inherits' nội bộ và nó cung cấp TRUE cho các đối tượng bắt nguồn từ 'data.frame'. Ví dụ trên 'data.table' là tốt. Nếu đó là mong muốn, thì có, sử dụng 'kế thừa' là tốt hơn. – Arun

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