0

このデータフレームから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))

matMatrix パッケージを使用してスパース行列を取得できます

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行の正規化によって が作成され、マトリックスをグラフに変換してネットワーク分析を実行するときに問題が発生するため、これもオプションではありません。

ここで、秘訣はスパース行列からゼロを削除することでしょうか? しかし、どのように?

いずれにせよ、行列が非常に大きくなるため、ソリューションは可能な限り効率的でなければなりません。

4

1 に答える 1

1

基本的にあなたの最初のアイデア:

mat1 <- sparseMatrix(i = as.numeric(df1$from), j = as.numeric(df1$to),
                     x = df1$weight, 
                     dims = c(length(levels(df$from)), length(levels(df$to))), 
                     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      .    .      .     .
#Tommy       .    .      .     .
于 2015-12-09T11:52:07.253 に答える