2017-11-13 17 views
1

私は隣接リストを持っており、それを隣接行列またはエッジリストに入れようとしています。これは、隣接行列またはエッジリストから構築されたネットワーク上でネットワーク解析を行うためです。私はR: Adjacency list to Adjacency matrixを使用してみました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; 
....] 

が、これだけ作品私の隣接リスト場合:私は(各行がエントリの異なる量を持ち、空のエントリはNAです)、次のように隣接リストの例があるR. を使用しています2つのエントリを有する(すなわち、1つのグループ内に3つ以上の隣人が存在する)。私はエッジリストを取得しますが、私のリストの最初の2つのエントリだけを考慮に入れます。

Iはまた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にある場合、Iのような(アカウントにネットワークであろう重みをとる隣接行列を必要とします2つの行、そのエッジの重みは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

ありがとうございます。適用を使用して2番目の答えは、また、隣人として1番目と3番目のエントリを記載している行を持って任意の方法はありますか?例えば、3番目の行は値[17,90]です。これは、データ内の1番目と8番目のエントリをリストするなど、追加のエントリのために継続されます。 –

+0

@CatalinaGutierrez '?expand.grid()'や '?combn()'をチェックしたいかもしれません。 – lukeA

+0

最後のコメントは無視してください。更新:私は 'co = combn(e [[1]]、2)'によって櫛を使ってみました。ここでeはapplyを使用しています。私はdata.frameに変換し、転置を使ってエッジリストを取得しました:[17,50; 17,90; 50,90]。私はすべての値に対してこれを行うことができ、完全なエッジリストを得ました。しかし、これをグラフや隣接行列に変換すると、繰り返されるペアについて詳しく述べていると思います。私はこれを加重隣接行列とグラフに変える必要があります。たとえば、[17,50]がエッジリストに2回表示されている場合、これは17と50の間のエッジの重みが2であることを意味します。何か案は?ありがとうございました! –

関連する問題