2013-04-12 43 views
8

Tôi muốn tạo ra một cấu trúc dữ liệu theo hình thứclưu trữ một danh sách trong vòng một yếu tố khung dữ liệu trong R

Start, End, Elements 
    3 , 6 , {4,5} 
    4 , 10 , {7,8,9} 
    .... 

Nói cách, tôi đang di chuyển một quả bóng cùng một dòng. "Bắt đầu" đại diện cho vị trí trái nhất của quả bóng và "Kết thúc" đại diện cho đúng nhất. "Các yếu tố" có nghĩa là tôi bằng cách nào đó tìm thấy những vị trí đặc biệt. Cấu trúc dữ liệu tốt nhất để sử dụng khi số lượng các phần tử có thể phát triển rất lớn là gì? Điều duy nhất tôi có thể nghĩ đến là một khung dữ liệu trong đó cột thứ 3 là một chuỗi được định dạng thích hợp. Sau đó tôi sẽ phải phân tích chuỗi nếu tôi muốn xem từng số trong tập hợp. Có một định dạng dữ liệu tốt hơn R có hoặc là về nó?

Cảm ơn!

+2

Tại sao không chỉ là một danh sách? – joran

+0

Trên thực tế, điều này làm việc tuyệt vời và dễ thực hiện. Không nhận ra rằng một khung dữ liệu có thể lưu trữ một danh sách bên trong. Hoàn hảo, cảm ơn bạn – user1357015

+0

vì sao @Joran hoặc OP không đăng câu trả lời này như một câu trả lời? –

Trả lời

12

Tùy chọn đề cập trong nhận xét của tôi, tức là chỉ đơn giản là sử dụng một danh sách cho một trong các cột:

dat <- data.frame(Start = 3:4, End = c(6,10)) 
> dat 
    Start End 
1  3 6 
2  4 10 
> dat$Elements <- list(4:5,7:9) 
> dat 
    Start End Elements 
1  3 6  4, 5 
2  4 10 7, 8, 9 

Bạn cũng có thể tất nhiên khung dữ liệu mương hoàn toàn và chỉ cần sử dụng một danh sách cũ đồng bằng (mà có thể làm cho hơn trong nhiều trường hợp, anyway):

list(list(Start = 3,End = 6, Elements = 4:5),list(Start = 4,End = 10,Elements = 7:9)) 
[[1]] 
[[1]]$Start 
[1] 3 

[[1]]$End 
[1] 6 

[[1]]$Elements 
[1] 4 5 


[[2]] 
[[2]]$Start 
[1] 4 

[[2]]$End 
[1] 10 

[[2]]$Elements 
[1] 7 8 9 
+1

và nếu bạn sử dụng 'data.table', bạn có thể làm tất cả trên một dòng:' data.table (Start = 3: 4, End = c (6,10), Elements = list (4: 5, 7 : 9)) ' – eddi

+2

@eddi Có, nhưng sau đó bạn phải sử dụng ** data.table **. : p – joran

+3

không phải, ** nhận được ** - nếu nó tùy thuộc vào tôi, sẽ không còn 'data.frame' nào nữa :) – eddi

6

Bạn có thể lưu nó dưới dạng khung dữ liệu cao hơn khung rộng và có thể sử dụng data.table để xử lý hiệu quả. Đó là, làm cho một hàng cho mỗi yếu tố chứ không phải là một hàng cho mỗi cặp start-end

library(data.table) 
dt = data.table(Start=c(3, 3, 4, 4, 4), End=c(6, 6, 10, 10, 10), Elements=c(4, 5, 7, 8, 9)) 
# Start End Elements 
#1:  3 6  4 
#2:  3 6  5 
#3:  4 10  7 
#4:  4 10  8 
#5:  4 10  9 

Điều này sẽ cho phép bạn làm nhiều loại xử lý trên dữ liệu khá dễ dàng, chẳng hạn như xác định có bao nhiêu yếu tố trong mỗi khoảng:

dt[, list(Num.Elements=length(Elements)), by=c("Start", "End")] 

# Start End Num.Elements 
# 1:  3 6   2 
# 2:  4 10   3 

Điều này cũng sẽ làm cho dữ liệu dễ sử dụng cho lô sử dụng gói ggplot, thường dữ liệu ở định dạng cao.

Bạn có thể lưu ý rằng cấu trúc dữ liệu này lãng phí vì nó lặp lại Bắt đầu và Kết thúc cho mỗi phần tử. Tuy nhiên, các bảng dữ liệu được lưu trữ rất hiệu quả - ngay cả khi danh sách các phần tử của bạn có nghĩa là hàng triệu, nó có thể dễ dàng phù hợp và được xử lý theo cách này. Hãy thử một dòng như:

dt = data.table(Start=1:1e6, End=1:1e6, Elements=1:1e6) 

để trình diễn. Nó sẽ chắc chắn sẽ nhanh hơn để giải quyết hơn việc giữ từng danh sách phần tử dưới dạng một chuỗi và chia nhỏ nó mỗi lần.

+0

Tôi đã không nhận ra rằng lưu nó như là một danh sách như joran đã đề cập ở trên là một lựa chọn. Bây giờ tôi chỉ cần lưu nó như là một danh sách các yếu tố số mà trở nên dễ dàng để làm. Cảm ơn cho ý tưởng mặc dù, tôi thậm chí không nghĩ đến định dạng dài cho đến khi bạn đề cập! – user1357015

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