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
为了弄清楚为什么会这样,它可能会帮助您查看创建的图表并思考它如何表示您的问题。
我有一个如下所示的数据框。
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
为了弄清楚为什么会这样,它可能会帮助您查看创建的图表并思考它如何表示您的问题。