2013-05-16 2 views
9

내 문제는 매우 간단합니다. 가장자리 목록에서 인접 목록/행렬을 만들어야합니다.가장자리 목록에서 가중치가있는 인접성 목록/행렬을 만드는 방법은 무엇입니까?

나는 csv 문서에 column1 = node1과 column2 = node2로 저장된 가장자리 목록을 가지고 있는데, 이것을 가중치가있는 인접성 목록이나 가중치가있는 인접성 행렬로 변환하고 싶습니다.

여기에 숫자가 단순히 노드 식별자는 어디 데이터처럼 보이는 방법, 더 정확하게하려면

node1,node2 
551,548 
510,512 
548,553 
505,504 
510,512 
552,543 
512,510 
512,510 
551,548 
548,543 
543,547 
543,548 
548,543 
548,542 

가중 인접리스트/행렬이에서 변환을 달성하는 방법에 대한 팁은?

dat=read.csv(file.choose(),header=TRUE) # choose an edgelist in .csv file format 
el=as.matrix(dat) # coerces the data into a two-column matrix format that igraph likes 
el[,1]=as.character(el[,1]) 
el[,2]=as.character(el[,2]) 
g=graph.edgelist(el,directed=FALSE) # turns the edgelist into a 'graph object' 

감사합니다 : 이것은 내가 성공하지 않고, 이전에 그것을 할 해결 (Dai Shizuka의 제공) 방법입니다!

+2

작은 재현 가능한 예와이를 코딩 할 수있는 가능한 시도를 제공해 주시겠습니까? –

+0

[이 게시물] (http://stackoverflow.com/questions/14332233/using-graph-adjacency-in-r/14332667#14332667) 도움이 될 수 있습니다. – Arun

+0

저 게시물로 나를 가리켜 주신 것에 감사드립니다. 참으로 유용 합니다만, 제가 잘못 입력하지 않았다면 그들의 데이터는 이미 매트릭스 방식으로 정렬되어 있습니다. 반면에 편집 된 버전의 제 질문에서 볼 수 있듯이, 나는 다른 입력을 가지고 있습니다. 게시물을 편집하여 로마인에게도 회신 해 주시기 바랍니다. – Milo

답변

15

이 응답은 기본 R 만 사용합니다. 결과는 인접 행렬을 나타내는 데 사용되는 표준 행렬입니다.

el <- cbind(a=1:5, b=5:1) #edgelist (a=origin, b=destination) 
mat <- matrix(0, 5, 5) 
mat[el] <- 1 
mat 
# [,1] [,2] [,3] [,4] [,5] 
#[1,] 0 0 0 0 1 
#[2,] 0 0 0 1 0 
#[3,] 0 0 1 0 0 
#[4,] 0 1 0 0 0 
#[5,] 1 0 0 0 0 

여기 mat는 벡터 및 1:55:1 간단한 cbind이다 edgelist el에서 정의하여 인접 행렬이다.

edgelist에 가중치가 포함 된 경우 약간 다른 해결책이 필요합니다.

el <- cbind(a=1:5, b=5:1, c=c(3,1,2,1,1)) # edgelist (a=origin, b=destination, c=weight) 
mat<-matrix(0, 5, 5) 
for(i in 1:NROW(el)) mat[ el[i,1], el[i,2] ] <- el[i,3] # SEE UPDATE 
mat 
#  [,1] [,2] [,3] [,4] [,5] 
#[1,] 0 0 0 0 3 
#[2,] 0 0 0 1 0 
#[3,] 0 0 2 0 0 
#[4,] 0 1 0 0 0 
#[5,] 1 0 0 0 0 

UPDATE

얼마 후에 I는 이전 가중 edgelist 예의 루프 (3 행)에 대한 필요가 있다는 것을 깨달았다.

mat[el[,1:2]] <- el[,3] 
14

당신은 질문 (https://sites.google.com/site/daishizuka/toolkits/sna/sna_data)에 언급 내 웹 사이트에 게시물이 igraph 패키지를 사용, 그래서이 들어 있는지 확인하십시오 : 당신은 다음과 같은 벡터화 작업으로 대체 할 수 있습니다.

또한 최근에 igraph가 graph.data.frame()을 사용하여 edgelists에서 가중치가있는 인접성 행렬을 만드는 훨씬 쉬운 방법을 제공한다는 것을 알았습니다. 내 사이트에서이를 업데이트했지만 다음은 간단한 예입니다.

library(igraph) 
el=matrix(c('a','b','c','d','a','d','a','b','c','d'),ncol=2,byrow=TRUE) #a sample edgelist 
g=graph.data.frame(el) 
get.adjacency(g,sparse=FALSE) 

그렇게해야합니다. sparse = FALSE 인수는 인접 행렬에 0을 표시합니다. 당신이 정말로 igraph을 사용하지 않으려면,이 그것을 할 수있는 투박한 방법이라고 생각 :

el=matrix(c('a','b','c','d','a','d','a','b','c','d'),ncol=2,byrow=TRUE) #a sample edgelist 
lab=names(table(el)) #extract the existing node IDs 
mat=matrix(0,nrow=length(lab),ncol=length(lab),dimnames=list(lab,lab)) #create a matrix of 0s with the node IDs as rows and columns 
for (i in 1:nrow(el)) mat[el[i,1],el[i,2]]=mat[el[i,1],el[i,2]]+1 #for each row in the edgelist, find the appropriate cell in the empty matrix and add 1. 
+0

가중치 네트워크의 경우, get.adjacency() 호출에'attr = 'weight''를 추가하여 가중치가없는 버전 대신 가중치가있는 인접성 매트릭스를 반환하도록 할 수 있습니다. –

+0

좋은 링크, 그것은 또한 가장자리의 목록을 가져 오기 위해 프레임의 사용을 보여줍니다. 파이썬에서 비슷한 API가 보이지 않습니다. / – user305883

0

qdapTools 또 다른 가능성 패키지 : 데이터와

library(qdapTools) 

el[rep(seq_len(nrow(el)), el[,'c']), c('a', 'b')] %>% 
    {split(.[,'b'], .[,'a'])} %>% 
    mtabulate() 

## 1 2 3 4 5 
## 1 0 0 0 0 3 
## 2 0 0 0 1 0 
## 3 0 0 2 0 0 
## 4 0 1 0 0 0 
## 5 1 0 0 0 0 
1

시작

헤드 (가장자리)

node1 node2 
1 551 548 
2 510 512 
3 548 553 
4 505 504 
5 510 512 
6 552 543 

library(igraph) 
as.matrix(get.adjacency(graph.data.frame(edges))) 

    551 510 548 505 552 512 543 553 504 547 542 
551 0 0 2 0 0 0 0 0 0 0 0 
510 0 0 0 0 0 2 0 0 0 0 0 
548 0 0 0 0 0 0 2 1 0 0 1 
505 0 0 0 0 0 0 0 0 1 0 0 
552 0 0 0 0 0 0 1 0 0 0 0 
512 0 2 0 0 0 0 0 0 0 0 0 
543 0 0 1 0 0 0 0 0 0 1 0 
553 0 0 0 0 0 0 0 0 0 0 0 
504 0 0 0 0 0 0 0 0 0 0 0 
547 0 0 0 0 0 0 0 0 0 0 0 
542 0 0 0 0 0 0 0 0 0 0 0 
: 프레임 가장자리 사용 igraph는 인접 행렬을 구하는
관련 문제