r中两个变量的分组

Grouping of two variables in r

我有一个如下所示的数据框。

dat <- data.frame(v1=c("a","b","c","c","a","w","f"),
              v2=c("z","a","a","w","p","e","h"))

 v1 v2
1  a  z
2  b  a
3  c  a
4  c  w
5  a  p
6  w  e
7  f  h

我想根据这些字母是否出现在同一行来添加分组列。

   v1 v2  gp
1  a  z   1
2  b  a   1
3  c  a   1
4  c  w   1
5  a  p   1
6  w  e   1
7  f  h   2

我的想法是先将第一行分配到组1,然后v1或v2是"a"或"z"的任何行也将分配到组1。

有像第 3 行和第 4 行这样的场景,其中 c 被分配到第 1 组,因为在第 3 行中,v2 是 "a"。并且 "w" 被分配给第 1 组,因为在第 4 行中 v1 是 "c",它先前被分配给第 1 组。但是我的列表很长,所以我无法检查所有 "descendants"。

我想知道是否有办法将这些字母分组,return 一个带有组号的列表。类似下面的 table 就可以了。

letter  gp
a       1
b       1
c       1
e       1
f       2
h       2
w       1
z       1

解决这个问题的一种方法是将字母视为图形的顶点,并与顶点之间的 link 在同一行中。那么你要的是图的连通分量。使用 R 中的 igraph 包,所有这些都很容易。

library(igraph)
G = graph_from_edgelist(as.matrix(dat), directed=FALSE)
letters = sort(unique(c(as.character(dat$v1), as.character(dat$v2))))
(gp = components(G)$membership[letters])
a b c e f h p w z 
1 1 1 1 2 2 1 1 1 

如果您想要 data.frame 包含此信息

(Groups = data.frame(letters, gp, row.names=NULL))
  letters gp
1       a  1
2       b  1
3       c  1
4       e  1
5       f  2
6       h  2
7       p  1
8       w  1
9       z  1

为了弄清楚为什么会这样,它可能会帮助您查看创建的图表并思考它如何表示您的问题。