2017-11-13 14 views
1

인접 목록이 있고 인접 행렬 또는 가장자리 목록을 만들려고합니다. 이는 인접성 매트릭스 또는 에지 목록으로 구축 된 네트워크에서 네트워크 분석을 수행하기위한 것입니다.r 인접 목록에서 인접 행렬 또는 가장자리 목록을 만듭니다.

[17,50,90,NA,NA; 
80,67,NA,NA,NA; 
33,31,32, NA,NA; 
33,31,32,NA,NA; 
354,56,87,97,32; 
....] 

내가 R: Adjacency list to Adjacency matrix를 사용하여 시도하지만,이 단지 작품 내 인접리스트의 경우 : 나는 R. 다음과 같이 (빈 항목이 NA 각 행 항목의 다른 양을 가지고 있으며, 있습니다)되고 인접리스트의 예를 사용하고 있습니다 두 개의 항목이 있습니다 (즉, 한 그룹에 두 개 이상의 이웃이 있음). 가장자리 목록을 얻지 만 내 목록의 처음 두 항목 만 고려합니다.

는 또한 From list to adjacency matrix를 사용하지만 오류로했다 igraphmake_graph(unlist(mydata)) 사용하여 시도 : "At type_indexededgelist.c:117 : cannot create empty graph with negative number of vertices, Invalid value"

내가 계정으로 네트워크에있을 것 가중치를 취하는 인접 행렬 필요를 (같은 항목 31, 32에있는 경우 두 행, 그 다음 가장자리 무게는 2가 될 것입니다. 도움 주셔서 감사합니다.

답변

0

I have an adjacency list and I am trying to make it into an[...] edge list.

어쩌면 당신은 당신/당신의 "인접리스트는"무엇을 나타내는 지 필요에 따라

e <- apply(lst, 1, function(x)x[!is.na(x)]) 
(e <- do.call(rbind, lapply(e, embed, 2))[,2:1]) 
#  [,1] [,2] 
# [1,] 17 50 
# [2,] 50 90 
# [3,] 80 67 
# [4,] 33 31 
# [5,] 31 32 
# [6,] 33 31 
# [7,] 31 32 
# [8,] 354 56 
# [9,] 56 87 
# [10,] 87 97 
# [11,] 97 32 

lst <- read.csv(header=F, comment.char=";", colClasses="integer", text=" 
17,50,90,NA,NA; 
80,67,NA,NA,NA; 
33,31,32,NA,NA; 
33,31,32,NA,NA; 
354,56,87,97,32;") 
m <- as.matrix(lst) 
e <- stack(split(m, row(m)))[,2:1] 
(e <- e[complete.cases(e),]) 
# 1 1  17 
# 2 1  50 
# 3 1  90 
# 6 2  80 
# 7 2  67 
# 11 3  33 
# 12 3  31 
# 13 3  32 
# 16 4  33 
# 17 4  31 
# 18 4  32 
# 21 5 354 
# 22 5  56 
# 23 5  87 
# 24 5  97 
# 25 5  32 

또는

을 할 수 있습니다.

+0

대단히 감사합니다. 적용을 사용하는 두 번째 대답은 이웃으로 1, 3 번째 항목을 나열하는 행을 가질 수있는 방법이 있습니까? 예를 들어 세 번째 행의 값은 [17,90]입니다. 이는 내 데이터에서 첫 번째 및 여덟 번째 항목을 나열하는 것과 같은 추가 항목에 대해 계속됩니다. –

+0

@CatalinaGutierrez'? expand.grid()'및/또는'? combn() '을 확인하고 싶을 수도 있습니다. – lukeA

+0

마지막 코멘트를 무시하십시오. 업데이트 : 나는 co = combn (e [[1]], 2)'에 의해 빗을 사용하려고 시도했다. 여기서 e는 apply를 사용하는 것이다. 나는 data.frame으로 변환하고 transpose를 사용하여 가장자리 목록을 얻습니다. [17,50; 17,90; 50,90]. 모든 값에 대해이 작업을 수행 할 수 있었고 완전한 가장자리 목록을 얻을 수있었습니다. 그러나 이것을 그래프와 인접 행렬로 바꿀 때 반복되는 쌍을 다시 말해야한다고 생각합니다. 나는 이것을 가중치 된 인접 행렬과 그래프로 바꾸어야한다. 예를 들어 [17,50]이 내 가장자리 목록에 두 번 나타나면 17 ~ 50 사이의 가장자리의 가중치가 2임을 의미합니다. 어떤 아이디어? 다시 감사합니다! –