2017-02-03 2 views
3

У меня есть следующее ребро list с числом, которое связывает край с номером пути. Это определяется следующим matrix, которую я называю Totallist: `несколько матриц смежности для одного edgelist R

Begin edge end edge path number 
1    3   1 
3    4   1 
4    5   1 
6    3   2 
3    2   2` 

Я хочу построить смежности matrices для каждого из путей. В этом примере я хочу два matrices, но может быть и больше. Я написал следующее, но он только находит matrix для первого пути. Я не уверен, как написать что-то, что будет работать для любого количества путей, которые я бросить на нее:

X<-as.data.frame(table(Totallist[,3])) 

nlines<-nrow(X) 
nlines 
freq<-X[1,2] 

diameterofmatrix<-max(Totallist) 

X1<-get.adjacency(graph.edgelist(as.matrix(Totallist[1:X[1,2],1:2]), directed=FALSE)) 
X1<-rbind(X1, 0) 
X1<-cbind(X1, 0) 
X1 

Я также необходим matrices всех быть таким же размером так, поэтому я добавил дополнительную строку и столбец , Я мог бы продолжать использовать мой метод, но он кажется довольно уродливым. Большое спасибо за любую помощь.

ответ

1

Для извлечения матрицы смежности в список, вы можете сделать следующее (я произвожу некоторые поддельные данные):

set.seed(42) 
df <- data.frame(beginEdge = sample(1:10, 10, replace = TRUE), 
       endEdge = sample(1:10, 10, replace=TRUE), 
       pathNum = rep(c(1,2), each=5)) 
df 

     beginEdge endEdge pathNum 
1   10  5  1 
2   10  8  1 
3   3  10  1 
4   9  3  1 
5   7  5  1 
6   6  10  2 
7   8  10  2 
8   2  2  2 
9   7  5  2 
10   8  6  2 


paths <- unique(df$pathNum) # get the paths to iterate through 

Если сделать узлы факторов и установить уровни факторов для всех узлов в совокупности матрицы смежности будут вычисляться для населения в вашей сети. Я предполагаю, что здесь сеть состоит из десяти актеров. Если ваши наблюдаемые данные содержат все узлы, с которыми вы хотите работать, установите уровни на unique(c(df$beginEdge,df$endEdge)) или что-то, что вы предпочитаете.

df$beginEdge <- factor(df$beginEdge, levels=1:10) 
df$endEdge <- factor(df$endEdge, levels=1:10) 

Перейдем теперь по списку путей и создания матриц хранящие их в виде списка:

list.of.adj.mats <- lapply(paths, function(i){ 
     matrix(as.numeric((
     table(df$beginEdge[df$pathNum==i], 
     df$endEdge[df$pathNum==i])+ 
     table(df$endEdge[df$pathNum==i], 
     df$beginEdge[df$pathNum==i]))>0), 
    nrow=length(levels(df$beginEdge)))}) 
list.of.adj.mats 
[[1]] 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] 0 0 0 0 0 0 0 0 0  0 
[2,] 0 0 0 0 0 0 0 0 0  0 
[3,] 0 0 0 0 0 0 0 0 1  1 
[4,] 0 0 0 0 0 0 0 0 0  0 
[5,] 0 0 0 0 0 0 1 0 0  1 
[6,] 0 0 0 0 0 0 0 0 0  0 
[7,] 0 0 0 0 1 0 0 0 0  0 
[8,] 0 0 0 0 0 0 0 0 0  1 
[9,] 0 0 1 0 0 0 0 0 0  0 
[10,] 0 0 1 0 1 0 0 1 0  0 

[[2]] 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] 0 0 0 0 0 0 0 0 0  0 
[2,] 0 1 0 0 0 0 0 0 0  0 
[3,] 0 0 0 0 0 0 0 0 0  0 
[4,] 0 0 0 0 0 0 0 0 0  0 
[5,] 0 0 0 0 0 0 1 0 0  0 
[6,] 0 0 0 0 0 0 0 1 0  1 
[7,] 0 0 0 0 1 0 0 0 0  0 
[8,] 0 0 0 0 0 1 0 0 0  1 
[9,] 0 0 0 0 0 0 0 0 0  0 
[10,] 0 0 0 0 0 1 0 1 0  0 
+0

Большое спасибо за ответ. Просто глядя на матрицы смежности, которые дает ваш ответ, я считаю, что они должны быть симметричными по диагонали. Другими словами, запись [i, j] = entry [j, i]. Это не похоже на ваш ответ? – user7512228

+0

Пример, который вы указали, состоит в вычислении неориентированной матрицы смежности, поэтому нет необходимости, чтобы она была симметричной - матрицы, которые я создал, кодировали всю информацию, необходимую в ненаправленной матрице смежности, чтобы представлять пути. Тем не менее, я отредактировал код для создания симметричных матриц, если это то, что вам нужно (хотя это делает его немного беспорядочным). – gfgm

+0

Большое спасибо, я должен был упомянуть, что мне нужны симметричные смежные матрицы. – user7512228

Смежные вопросы