创建一个与直接和间接连接的值相关的群组索引

16
我想根据两列生成索引来分组观察值。但我希望组是由至少共享一个观察值的观察值构成的。
在下面的数据中,我想检查“G1”和“G2”中的值是否直接连接(出现在同一行)或间接通过其他中间值连接。所需的分组变量显示在“g”中。
例如,A直接与Z(第1行)和X(第2行)相关联。A通过X(A->X->B)间接与B相关联,并通过X和B进一步与Y相关联(A->X->B->Y)。
dt <- data.frame(id = 1:10,
                 G1 = c("A","A","B","B","C","C","C","D","E","F"),
                 G2 = c("Z","X","X","Y","W","V","U","s","T","T"),
                 g = c(1,1,1,1,2,2,2,3,4,4))

dt
#    id G1 G2 g
# 1   1  A  Z 1
# 2   2  A  X 1
# 3   3  B  X 1
# 4   4  B  Y 1
# 5   5  C  W 2
# 6   6  C  V 2
# 7   7  C  U 2
# 8   8  D  s 3
# 9   9  E  T 4
# 10 10  F  T 4

我尝试使用dplyr中的group_indices,但是还没有成功。
1个回答

20

使用 igraph 获取成员资格,然后映射到名称:

library(igraph)

# convert to graph, and get clusters membership ids
g <- graph_from_data_frame(df1[, c(2, 3, 1)])
myGroups <- components(g)$membership

myGroups 
# A B C D E F Z X Y W V U s T 
# 1 1 2 3 4 4 1 1 1 2 2 2 3 4 

# then map on names
df1$group <- myGroups[df1$G1]


df1
#    id G1 G2 group
# 1   1  A  Z     1
# 2   2  A  X     1
# 3   3  B  X     1
# 4   4  B  Y     1
# 5   5  C  W     2
# 6   6  C  V     2
# 7   7  C  U     2
# 8   8  D  s     3
# 9   9  E  T     4
# 10 10  F  T     4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接