使用R简单转换为edgelist?

R-o*_*ert 5 r data-conversion edges igraph

我需要在R中进行简单的数据转换,以便与igraph一起使用.我的数据框采用这种格式,按以下方式分组GROUP:

    A   GROUP
1   1       a
2   2       a
3   3       a
4   4       a
5   1       b
6   3       b
7   5       b
Run Code Online (Sandbox Code Playgroud)

1.如何扩展组以获得el此格式的无向边缘列表?

    A   B
1   1   2
2   1   3
3   1   4
4   2   3
5   2   4
6   3   4
7   1   3
8   1   5
9   3   5
Run Code Online (Sandbox Code Playgroud)

注意:没有自我引用1-1,2-2,3-3,...

2.如何计算AB出现次数并从中创建加权边缘列表el

    A   B   weight
1   1   2        1
2   1   3        2
3   1   4        1
4   2   3        1
5   2   4        1
6   3   4        1
7   1   5        1
8   3   5        1
Run Code Online (Sandbox Code Playgroud)

Sac*_*amp 2

这是一种获取边缘列表的方法plyr

foo <- data.frame(
  A = c(1,2,3,4,1,3,5),   
  GROUP = c("a","a","a","a","b","b","b"))

library("plyr")

E1 <- do.call(rbind,dlply(foo,.(GROUP),function(x)t(combn(x$A,2))))

E1
Run Code Online (Sandbox Code Playgroud)

返回:

      [,1] [,2]
 [1,]    1    2
 [2,]    1    3
 [3,]    1    4
 [4,]    2    3
 [5,]    2    4
 [6,]    3    4
 [7,]    1    3
 [8,]    1    5
 [9,]    3    5
Run Code Online (Sandbox Code Playgroud)

然后获取权重(这里我使用将combn最小的数字放在第一位):

W <- apply(E1,1,function(x)sum(E1[,1]==x[1]&E1[,2]==x[2]))
E2 <- cbind(E1,weight=W)
E2 <- E2[!duplicated(E2),]

E2
Run Code Online (Sandbox Code Playgroud)

返回:

         weight
[1,] 1 2      1
[2,] 1 3      2
[3,] 1 4      1
[4,] 2 3      1
[5,] 2 4      1
[6,] 3 4      1
[7,] 1 5      1
[8,] 3 5      1
Run Code Online (Sandbox Code Playgroud)