実現したいこと
- そのグループの変数の内、自分の変数と同じ数字を一つでも共有していれば同じグループに分類したい。
前提
以下のようなデータがあるとします。
R
1data <- data.frame( 2 V1 = c(1, 1, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7), 3 V2 = c(1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 5, 6, 7), 4 V3 = c(1, 1, 1, 2, 3, 4, 5, 5, 6, 5, 6, 7, 8) 5) 6 7>print(data) 8 V1 V2 V3 91 1 1 1 102 1 2 1 113 2 2 1 124 3 3 2 135 3 3 3 146 4 4 4 157 4 4 5 168 4 5 5 179 4 5 6 1810 5 5 5 1911 5 5 6 2012 6 6 7 2113 7 7 8
このデータをグループ化する新たな変数を作りたいです。
具体的には、第1変数、第2変数、第3変数、どれか一つでもあるグループの行と同じだと、同じグループとしたいです。つまり、「自分以外のグループの構成員の内誰か一人でも変数のどれかを共有している」という条件です。逆に言えば、第1変数、第2変数、第3変数の全てにおいてそのグループのどの行とも共有しない場合、異なるグループとしたいです。例えば、上記のデータをこの規則に従ってグループ化(第4変数)すると、以下のようなものになります。
R
1>print(data) 2 V1 V2 V3 Group 31 1 1 1 1 42 1 2 1 1 53 2 2 1 1 64 3 3 2 2 75 3 3 3 2 86 4 4 4 3 97 4 4 5 3 108 4 5 5 3 119 4 5 6 3 1210 5 5 5 3 1311 5 5 6 3 1412 6 6 7 4 1513 7 7 8 5
これを実現するコードが無知ゆえに見当が付きません。各変数ではグループ化(tidyverseなどによるもの)は当然できるが、各変数グループの論理和的なグルーピングのコードがどうやっても思いつかないため、大変申し訳ないが知恵をお借りしたいです。
調査したこと・試したこと
以下のコードを実行しましたが、思った出力にはなりませんでした。
R
1data <- data.frame( 2 V1 = c(1, 1, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7), 3 V2 = c(1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 5, 6, 7), 4 V3 = c(1, 1, 1, 2, 3, 4, 5, 5, 6, 5, 6, 7, 8) 5) 6 7data <- data %>% 8 group_by(V1|V2|V3) %>% 9 mutate(group_id = group_indices()) 10 11print(data) 12 13> print(data) 14# A tibble: 13 × 5 15# Groups: V1 | V2 | V3 [1] 16 V1 V2 V3 `V1 | V2 | V3` group_id 17 <dbl> <dbl> <dbl> <lgl> <int> 18 1 1 1 1 TRUE 1 19 2 1 2 1 TRUE 1 20 3 2 2 1 TRUE 1 21 4 3 3 2 TRUE 1 22 5 3 3 3 TRUE 1 23 6 4 4 4 TRUE 1 24 7 4 4 5 TRUE 1 25 8 4 5 5 TRUE 1 26 9 4 5 6 TRUE 1 2710 5 5 5 TRUE 1 2811 5 5 6 TRUE 1 2912 6 6 7 TRUE 1 3013 7 7 8 TRUE 1
単純に論理和をグルーピングに入れるだけでは理想の出力になりません。(そりゃそうですが。)
しかし、これ以外に思いつきません。
補足情報(FW/ツールのバージョンなど)
Rstudioは3か月前に更新したもの。OSはwindows11。