回答編集履歴
3
説明の改善
test
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
[igraph パッケージ](https://cran.r-project.org/web/packages/igraph/index.html) を用い,データの各行を頂点とする無向グラフを使ってグループ分けする記述例を下記に示します。
|
2
2
|
|
3
|
-
* 隣接行列(`w`)を用意し,
|
3
|
+
* 隣接行列(`w`)を用意し,両頂点が「3変数のどれかを共有しているか否か」で「`1`と`0` 」を(無向グラフに必要な左下三角部分に)格納する
|
4
4
|
|
5
5
|
* 隣接行列(`w`)から無向グラフ(`g`)を作成する
|
6
6
|
|
2
書式の改善
test
CHANGED
@@ -27,7 +27,7 @@
|
|
27
27
|
}
|
28
28
|
|
29
29
|
g <- graph_from_adjacency_matrix(w, mode="lower")
|
30
|
-
data$group_id
|
30
|
+
data$group_id <- components(g)$membership
|
31
31
|
|
32
32
|
print(data)
|
33
33
|
## V1 V2 V3 group_id
|
1
より簡単な方法に回答を修正
test
CHANGED
@@ -1,12 +1,10 @@
|
|
1
1
|
[igraph パッケージ](https://cran.r-project.org/web/packages/igraph/index.html) を用い,データの各行を頂点とする無向グラフを使ってグループ分けする記述例を下記に示します。
|
2
2
|
|
3
|
-
*
|
3
|
+
* 隣接行列(`w`)を用意し,辺の両頂点が「3変数のどれかを共有しているか否か」で「`1`と`0` 」を(無向グラフに必要な左下三角部分に)格納する
|
4
4
|
|
5
|
-
* 隣接行列(`w`)から
|
5
|
+
* 隣接行列(`w`)から無向グラフ(`g`)を作成する
|
6
6
|
|
7
|
-
* 最短距離行列(`d`)を整数化して微小量を無視すると,同じグループの頂点の列は同じ値になるので,列の重複をなくした行列(`u`)の列数がグループ数となる
|
8
|
-
|
9
|
-
*
|
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
|
-
|
25
|
+
1, 0)
|
28
26
|
}
|
29
27
|
}
|
30
28
|
|
31
|
-
g <- graph_from_adjacency_matrix(w, mode="lower"
|
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
|
-
|
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
|