回答編集履歴

2

2023/12/26 17:48

投稿

melian
melian

スコア19865

test CHANGED
@@ -12,7 +12,7 @@
12
12
  mutate(group_id = list(which(colSums(c_across(everything()) == t(.)) > 0))) %>%
13
13
  mutate(group_id =
14
14
  reduce(.$group_id,
15
- ~{ s <- intersect(unlist(.x), unlist(.y)); ifelse(length(s), list(s), .x) },
15
+ ~{ s <- intersect(unlist(.x), .y); ifelse(length(s), list(s), .x) },
16
16
  .init=list(group_id))) %>%
17
17
  group_by(group_id) %>%
18
18
  mutate(group_id = cur_group_id()) -> data

1

2023/12/26 17:09

投稿

melian
melian

スコア19865

test CHANGED
@@ -1,18 +1,26 @@
1
+ ```r
1
- > 第1変数、第2変数、第3変数、どれか一つでも他の行と同じだと、同じグループとしたいです。逆に言えば、第1変数、第2変数、第3変数の全てにおいて他の行と共有しない場合、異なるグループとしたいです。
2
+ suppressMessages(library(tidyverse))
2
3
 
3
- その通りに処理を行う場合、6行目から11行目までは同じグループにはなりません。例えば6行目の `4, 4, 4` は 6,7,8,9行目のグループに属しますが、7行目の `4, 4, 5` は 6,7,8,9,10行目のグループに入ります。なので、正確には、6行目の `group_id` は `3, 4, 5`, 7行目は `3, 4, 5, 6` になるかと思います。(複数のグループに属しているという意味です)
4
+ data <- data.frame(
5
+ V1 = c(1, 1, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7),
6
+ V2 = c(1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 5, 6, 7),
7
+ V3 = c(1, 1, 1, 2, 3, 4, 5, 5, 6, 5, 6, 7, 8)
8
+ )
4
9
 
5
- ```r
6
10
  data %>%
7
11
  rowwise() %>%
8
12
  mutate(group_id = list(which(colSums(c_across(everything()) == t(.)) > 0))) %>%
13
+ mutate(group_id =
14
+ reduce(.$group_id,
15
+ ~{ s <- intersect(unlist(.x), unlist(.y)); ifelse(length(s), list(s), .x) },
16
+ .init=list(group_id))) %>%
9
17
  group_by(group_id) %>%
10
18
  mutate(group_id = cur_group_id()) -> data
11
19
 
12
20
  data
13
21
 
14
22
  # # A tibble: 13 × 4
15
- # # Groups: group_id [9]
23
+ # # Groups: group_id [5]
16
24
  # V1 V2 V3 group_id
17
25
  # <dbl> <dbl> <dbl> <int>
18
26
  # 1 1 1 1 1
@@ -21,12 +29,11 @@
21
29
  # 4 3 3 2 2
22
30
  # 5 3 3 3 2
23
31
  # 6 4 4 4 3
24
- # 7 4 4 5 4
32
+ # 7 4 4 5 3
25
- # 8 4 5 5 5
33
+ # 8 4 5 5 3
26
- # 9 4 5 6 5
34
+ # 9 4 5 6 3
27
- # 10 5 5 5 6
35
+ # 10 5 5 5 3
28
- # 11 5 5 6 7
36
+ # 11 5 5 6 3
29
- # 12 6 6 7 8
37
+ # 12 6 6 7 4
30
- # 13 7 7 8 9
38
+ # 13 7 7 8 5
31
39
  ```
32
-