Вот способ получить список ребер с помощью 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
Возвращает:
[,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
Затем, чтобы получить веса (здесь я использую, что 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
Что возвращает:
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