このデータフレームからdf
group from to weight
1 1 Joey Joey 1
2 1 Joey Deedee 1
3 1 Deedee Joey 1
4 1 Deedee Deedee 1
5 2 Johnny Johnny 1
6 2 Johnny Tommy 1
7 2 Tommy Johnny 1
8 2 Tommy Tommy 1
このように作成できます
df <- structure(list(group = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), from =
structure(c(2L, 2L, 1L, 1L, 3L, 3L, 4L, 4L), .Label = c("Deedee",
"Joey", "Johnny", "Tommy"), class = "factor"), to = structure(c(2L, 1L,
2L, 1L, 3L, 4L, 3L, 4L), .Label = c("Deedee", "Joey", "Johnny",
"Tommy"), class = "factor"), weight = c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L)), .Names = c("group", "from", "to", "weight"), class = "data.frame",
row.names = c(NA, -8L))
mat
Matrix パッケージを使用してスパース行列を取得できます
mat <- sparseMatrix(i = as.numeric(df$from), j = as.numeric(df$to), x =
df$weight, dimnames = list(levels(df$from), levels(df$to)))
次のようになります。
4 x 4 sparse Matrix of class "dgCMatrix"
Deedee Joey Johnny Tommy
Deedee 1 1 . .
Joey 1 1 . .
Johnny . . 1 1
Tommy . . 1 1
.
元の行列の次元を減らさずに使用して疎な部分行列を作成するにはどうすればよいですか?df$group
結果は次のようになります。
4 x 4 sparse Matrix of class "dgCMatrix"
Deedee Joey Johnny Tommy
Deedee 1 1 . .
Joey 1 1 . .
Johnny . . . .
Tommy . . . .
最初のアイデア
データフレームをサブセット化してサブマトリックスを作成すると
df1 <- subset(df, group == 1)
mat1 <- sparseMatrix(i = as.numeric(df1 $from), j = as.numeric(df1 $to),
x = df1 $weight)
結果は 2 x 2 のスパース行列です。これはオプションではありません。「2 つのノードを失う」ことに加えて、ディメンション名として使用する因子レベルをフィルター処理する必要もあります。
秘訣は、行列を作成するときに要素を失わないようにすることです。
第二のアイデア
df$weight
興味のないグループをゼロに設定し、サブマトリックスを作成した場合
df2 <- df
df2[df2$group == 2, 4] <- 0
mat2 <- sparseMatrix(i = as.numeric(df2$from), j = as.numeric(df2$to), x
= df2$weight, dimnames = list(levels(df$from), levels(df$to)))
行列には適切な次元があり、因子レベルを次元名として簡単に使用できますが、行列にはゼロが含まれています。
4 x 4 sparse Matrix of class "dgCMatrix"
Deedee Joey Johnny Tommy
Deedee 1 1 . .
Joey 1 1 . .
Johnny . . 0 0
Tommy . . 0 0
NaN
行の正規化によって が作成され、マトリックスをグラフに変換してネットワーク分析を実行するときに問題が発生するため、これもオプションではありません。
ここで、秘訣はスパース行列からゼロを削除することでしょうか? しかし、どのように?
いずれにせよ、行列が非常に大きくなるため、ソリューションは可能な限り効率的でなければなりません。