Jak utworzyć ważoną listę/macierz z listy krawędzi?
Mój problem jest bardzo prosty: muszę utworzyć listę adjacency / macierz z listy krawędzi.
Mam listę krawędzi przechowywaną w dokumencie csv z column1 = node1 i column2 = node2 i chciałbym przekonwertować to na ważoną listę przyległości lub ważoną macierz przyległości.
Aby być bardziej precyzyjnym, oto jak wyglądają dane-gdzie liczby są po prostu identyfikatorami węzłów:
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
Wszelkie wskazówki, jak osiągnąć konwersję z tego do ważonej adjacencji lista / matrix? Tak postanowiłem zrobić to wcześniej, bez powodzenia (dzięki uprzejmości Dai Shizuka):
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'
Dziękuję! 4 answers
Ta odpowiedź używa tylko bazy R. Rezultatem jest standardowa macierz używana do reprezentowania macierzy adjacencji.
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
Oto mat
macierz adjacencyjna zdefiniowana z edgelist el
, która jest prostą cbind
wektorów 1:5
i 5:1
.
Jeśli twój edgelist zawiera wagi, potrzebujesz nieco innego rozwiązania.
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
Jakiś czas później zdałem sobie sprawę, że pętla for (3rd line) w poprzednim ważonym przykładzie edgelist jest niepotrzebnie. Można go zastąpić następującą operacją wektorową:
mat[el[,1:2]] <- el[,3]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-05 02:38:08
Post na mojej stronie, o którym wspominasz w pytaniu ( https://sites.google.com/site/daishizuka/toolkits/sna/sna_data ) używa pakietu igraph, więc upewnij się, że jest załadowany.
Co więcej, niedawno zdałem sobie sprawę, że igraph zapewnia znacznie łatwiejszy sposób tworzenia ważonej macierzy adiacenckiej z edgelist, za pomocą grafu.data.frame (). Zaktualizowałem to na mojej stronie, ale oto prosty przykład:
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)
To powinno wystarczyć. Argument sparse = FALSE mówi, że pokazuje 0s w macierz przylegania.
Jeśli naprawdę nie chcesz używać igraph, myślę, że jest to niezgrabny sposób, aby to zrobić: {]}
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.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-29 14:43:06
Zacznij od krawędzi ramki danych i użyj igraph, aby uzyskać macierz przylegającą:
Głowa (krawędzie)
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-04 06:26:38
Kolejna możliwość z pakietem 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-04 04:45:26