2009-07-11 62 views
6

Tôi có một data.frame với 2 cột: Nút A, Nút B. Mỗi mục nhập trong khung ngụ ý một cạnh trong biểu đồ giữa nút A và B.Tạo danh sách kề từ một data.frame

Có phải là một lớp lót đẹp để chuyển đổi data.frame này thành danh sách kề. Bất kỳ gợi ý nào?

Trả lời

6

Nhanh chóng và bẩn ...

> edges <- data.frame(nodea=c(1,2,4,2,1), nodeb=c(1,2,3,4,5)) 

> adjlist <- by(edges, edges$nodea, function(x) x$nodeb) 

> for (i in as.character(unique(edges$nodea))) { 
+ cat(i, ' -> ', adjlist[[i]], '\n') 
+ } 

1 -> 1 5 
2 -> 2 4 
4 -> 3 

> adjlist 
edges$nodea: 1 
[1] 1 5 
------------------------------------------------------------ 
edges$nodea: 2 
[1] 2 4 
------------------------------------------------------------ 
edges$nodea: 4 
[1] 3 
+0

Guh. Vâng. Đó là một lớp lót hoàn hảo. Thật kỳ lạ, giải pháp vòng lặp của tôi chạy nhanh gấp hai lần bởi(). –

+0

thực sự nó không phải là rất nhanh khi bảng của bạn là 50.000 dài (với ~ 5000 định danh). Có lựa chọn thay thế nhanh hơn không? –

0

bạn thậm chí sẽ thể hiện danh sách kề trong R như thế nào? nó cần các danh sách có kích thước thay đổi cho tập hợp các nút lân cận; do đó, bạn phải sử dụng một danh sách(); nhưng sau đó nó có gì tốt trong R?

tôi có thể nghĩ ra các thủ thuật què với các hàm giống như ngọc nhưng chúng thực hiện quét tuyến tính cho mỗi nút. nhưng chơi xung quanh trong 1 phút, đây là: danh sách các danh sách ghép nối, trong đó mục thứ hai của mỗi cặp là danh sách kề. đầu ra là điên hơn cấu trúc thực sự là.

> edgelist=data.frame(A=c(1,1,2,2,2),B=c(1,2,2,3,4)) 
> library(plyr) 
> llply(1:max(edgelist), function(a) list(node=a, adjacents=as.list(edgelist$B[edgelist$A==a]))) 
[[1]] 
[[1]]$node 
[1] 1 

[[1]]$adjacents 
[[1]]$adjacents[[1]] 
[1] 1 

[[1]]$adjacents[[2]] 
[1] 2 



[[2]] 
[[2]]$node 
[1] 2 

[[2]]$adjacents 
[[2]]$adjacents[[1]] 
[1] 2 

[[2]]$adjacents[[2]] 
[1] 3 

[[2]]$adjacents[[3]] 
[1] 4 



[[3]] 
[[3]]$node 
[1] 3 

[[3]]$adjacents 
list() 


[[4]] 
[[4]]$node 
[1] 4 

[[4]]$adjacents 
list() 
+0

Brendan- cách xem tiêu chuẩn (ít nhất là từ igraph) là một danh sách các đỉnh - và mỗi phần tử danh sách là một vectơ của các đỉnh liền kề. –

4
> edges <- data.frame(nodea=c(1,2,4,2,1), nodeb=c(1,2,3,4,5)) 

> attach(edges) 

> tapply(nodeb,nodea,unique) 

$`1` 
[1] 1 5 

$`2` 
[1] 2 4 

$`4` 
[1] 3 
+0

vì một số lý do lạ bên trong R 'tapply (as.character (nodeb), as.character (nodea), unique)' nhanh hơn 100 lần khi chuyển đổi bảng rất dài (100.000 dòng) thành một danh sách hơn là 'tapply (nodeb, nodea, độc đáo) '!!! –

11

Vì bạn gắn thẻ này, làm thế nào về việc sử dụng được xây dựng trong chức năng?

> g <- graph.data.frame(edges) 
> adjlist <- get.adjedgelist(g) 

Chỉ báo trước là các đỉnh không được lập chỉ mục, sẽ thay đổi với igraph 0.6.

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