0

次のように構造化された csv から、ソーシャル ネットワーク分析 (igraph の graph_from_adjacency_matrix を使用する可能性が高い) で使用する隣接行列を作成したいと考えています (ただし、はるかに大きい):

name vote1 vote2 vote3
Joe  1     0     1
Jane 0     0     1
Jill 1     0     1

ネットワーク分析では、ノードは名前変数になり、ノードは一緒に投票する頻度 (1 または 0) によって接続されます。何かのようなもの:

    Joe Jane Jill
Joe  0    2    3
Jane 2    0    2
Jill 3    2    0

これは単純に思えますが、このデータフレームを igraph グラフ オブジェクトの作成に使用できる隣接行列に変換できませんでした。as.matrix と data.matrix はそれを行列に変換しますが、隣接行列ではなく、「名前」変数の文字を保持するものではありません。私の行列代数は強力ではないので、明らかな何かが欠けている可能性があることはわかっていますが、それが何であるかを知るには十分ではありません。私は、ネットワーク分析の最終目標に到達するための他のソリューションに対してオープンです。

4

1 に答える 1

4

外積のいくつかのバージョンが必要だと思います。

# construct the matrix
myMat <- as.matrix(df[-1])

# same output as myMat %*% t(myMat)
resultMat <- tcrossprod(myMat)
# add names
dimnames(resultMat) <-  list(df$name, df$name)

resultMat
     Joe Jane Jill
Joe    2    1    2
Jane   1    1    1
Jill   2    1    2

非対角線は、個人が同時に投票した回数を示し、対角線は、個人が自分自身で投票した回数 (つまり、総投票数) を示します。

各個人の総投票数は必要ないため、対角線を 0 に置き換えることができます。

# remove diagonal
diag(resultMat) <- 0

resultMat
     Joe Jane Jill
Joe    0    1    2
Jane   1    0    1
Jill   2    1    0

以下の df1 に 2 つの投票と 2 つの投票者を追加します。Sal という名前の投票者がいて、投票 2 で 1 回だけ投票し、唯一の投票者です。

df1
 name vote1 vote2 vote3 vote4 vote5
1  Joe     1     0     1     0     1
2 Jane     0     0     1     1     0
3 Jill     1     0     1     1     0
4  Bob     1     0     1     1     0
5  Sal     0     1     0     0     0

このより大きな行列で上記のプロセスを実行すると、次のようになります。

resultMat
     Joe Jane Jill Bob Sal
Joe    0    1    2   2   0
Jane   1    0    2   2   0
Jill   2    2    0   3   0
Bob    2    2    3   0   0
Sal    0    0    0   0   0

どちらも同じ 3 票で投票したため、Sal のスロットはすべて 0 で、Bob-Jill Jill-Bob スロットは 3 です。

データ

df <-
structure(list(name = structure(c(3L, 1L, 2L), .Label = c("Jane", 
"Jill", "Joe"), class = "factor"), vote1 = c(1L, 0L, 1L), vote2 = c(0L, 
0L, 0L), vote3 = c(1L, 1L, 1L)), .Names = c("name", "vote1", 
"vote2", "vote3"), class = "data.frame", row.names = c(NA, -3L))

df1 <- 
structure(list(name = structure(c(4L, 2L, 3L, 1L, 5L), .Label = c("Bob", 
"Jane", "Jill", "Joe", "Sal"), class = "factor"), vote1 = c(1L, 
0L, 1L, 1L, 0L), vote2 = c(0L, 0L, 0L, 0L, 1L), vote3 = c(1L, 
1L, 1L, 1L, 0L), vote4 = c(0L, 1L, 1L, 1L, 0L), vote5 = c(1L, 
0L, 0L, 0L, 0L)), .Names = c("name", "vote1", "vote2", "vote3", 
"vote4", "vote5"), class = "data.frame", row.names = c(NA, -5L))
于 2016-12-29T20:25:59.117 に答える