回答編集履歴

3

説明の改善

2023/12/30 04:57

投稿

little_street
little_street

スコア402

test CHANGED
@@ -1,6 +1,6 @@
1
1
  [igraph パッケージ](https://cran.r-project.org/web/packages/igraph/index.html) を用い,データの各行を頂点とする無向グラフを使ってグループ分けする記述例を下記に示します。
2
2
 
3
- * 隣接行列(`w`)を用意し,辺の両頂点が「3変数のどれかを共有しているか否か」で「`1`と`0` 」を(無向グラフに必要な左下三角部分に)格納する
3
+ * 隣接行列(`w`)を用意し,両頂点が「3変数のどれかを共有しているか否か」で「`1`と`0` 」を(無向グラフに必要な左下三角部分に)格納する
4
4
 
5
5
  * 隣接行列(`w`)から無向グラフ(`g`)を作成する
6
6
 

2

書式の改善

2023/12/30 04:38

投稿

little_street
little_street

スコア402

test CHANGED
@@ -27,7 +27,7 @@
27
27
  }
28
28
 
29
29
  g <- graph_from_adjacency_matrix(w, mode="lower")
30
- data$group_id = components(g)$membership
30
+ data$group_id <- components(g)$membership
31
31
 
32
32
  print(data)
33
33
  ## V1 V2 V3 group_id

1

より簡単な方法に回答を修正

2023/12/30 04:37

投稿

little_street
little_street

スコア402

test CHANGED
@@ -1,12 +1,10 @@
1
1
  [igraph パッケージ](https://cran.r-project.org/web/packages/igraph/index.html) を用い,データの各行を頂点とする無向グラフを使ってグループ分けする記述例を下記に示します。
2
2
 
3
- * 辺の重みを格納する形式の隣接行列(`w`)を用意し,辺の両頂点が「3変数のどれかを共有しているか否か」で「`0.0001`(微小量)と`1` 」を重み距離)として(無向グラフに必要な左下三角部分に)格納する
3
+ * 隣接行列(`w`)を用意し,辺の両頂点が「3変数のどれかを共有しているか否か」で「`1`と`0` 」を(無向グラフに必要な左下三角部分に)格納する
4
4
 
5
- * 隣接行列(`w`)から辺に重み(距離)を持つ無向グラフ(`g`)を作成し,そこから最短距離行列(`d`)を求め
5
+ * 隣接行列(`w`)から無向グラフ(`g`)を作成
6
6
 
7
- * 最短距離行列(`d`)を整数化して微小量を無視すると,同じグループの頂点の列は同じ値になるので,列の重複をなくした行列(`u`)の列数がグループ数となる
8
-
9
- * 行列(`u`)の各行の「値ゼロの列番号」を `group_id` として `data` に追加する
7
+ * 関数 `components(g)` 出力する `membership` ベクトルを `group_id` として `data` に追加する
10
8
 
11
9
 
12
10
  ```R
@@ -24,22 +22,12 @@
24
22
  w[i, j] <- ifelse(any(data$V1[i] == data$V1[j],
25
23
  data$V2[i] == data$V2[j],
26
24
  data$V3[i] == data$V3[j]),
27
- 0.0001, 1)
25
+ 1, 0)
28
26
  }
29
27
  }
30
28
 
31
- g <- graph_from_adjacency_matrix(w, mode="lower", weighted=TRUE)
29
+ g <- graph_from_adjacency_matrix(w, mode="lower")
32
- d <- distances(g)
33
- u <- unique(round(d), MARGIN=2)
34
-
35
- for (i in 1:N) {
36
- for (j in 1:ncol(u)) {
37
- if (u[i, j] < 1) {
38
- data$group_id[i] <- j
30
+ data$group_id = components(g)$membership
39
- break
40
- }
41
- }
42
- }
43
31
 
44
32
  print(data)
45
33
  ## V1 V2 V3 group_id