1

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

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 组。但是我的名单很长,所以我不能一直检查所有的“后代”。

我想知道是否有办法对这些字母进行分组,并返回一个带有组号的列表。像下表这样的东西就可以了。

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

1 回答 1

1

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

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

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

于 2017-09-09T21:19:27.857 回答