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