R Найти "группы" кортежей

Я пытаюсь найти "группу" (id3) на основе двух переменных (id1, id2):

df = data.frame(id1 = c(1,1,2,2,3,3,4,4,5,5),
            id2 = c('a','b','a','c','c','d','x','y','y','z'),
            id3 = c(rep('group1',6), rep('group2',4)))


   id1 id2      id3
1    1   a   group1
2    1   b   group1
3    2   a   group1
4    2   c   group1
5    3   c   group1
6    3   d   group1
7    4   x   group2
8    4   y   group2
9    5   y   group2
10   5   z   group2   

Например, id1=1 относится к a и b из id2. Но id1=2 также связан с так как принадлежат к одной группе (a id3=group1). Но поскольку id1=2 и id1=3 делят id2=c, также id1=3 принадлежит этой группе (id3=1). Значения кортежа ((1,2),('a','b','c')) появляются нигде, поэтому никакая другая строка не принадлежит этой группе (которая в общем случае помечена как group1).

Моя идея состояла в том, чтобы создать таблицу на основе id3 которая впоследствии была бы заполнена в цикле.

solution = data.frame(id3= c('group1', 'group2'),id1=NA, id2=NA)
group= 1 

for (step in c(1:1000)) { # run many steps to make sure to get all values
  solution$id1[group] = # populate  
  solution$id2[group] = # populate  

  if (fully populated) {
    group = group +1
  }} 

Я изо всех сил пытаюсь увидеть, как заселить.


Отказ от ответственности: я задал подобный вопрос здесь, но использование имен в id2 привело к тому, что многие люди id2 мне на нечеткие строковые процедуры в R, которые здесь не нужны, поскольку существует точное решение. Я также включаю в этот пост весь код, который я пробовал с тех пор.

Ответы

Ответ 1

Вы можете использовать на igraph чтобы найти различные кластеры сетей

library(igraph)
g <- graph_from_data_frame(df, FALSE)
cg <- clusters(g)$membership
df$id3 <- cg[df$id1]
df

выход:

   id1 id2 id3
1    1   a   1
2    1   b   1
3    2   a   1
4    2   c   1
5    3   c   1
6    3   d   1
7    4   x   2
8    4   y   2
9    5   y   2
10   5   z   2