This is where the package is used igraph. The main idea is to create a graph and then extract two adjacent nodes for each node.
library(igraph)
X1 = split(df$person, df$group)
X2 = X1[lengths(X1) >= 2]
dat = data.frame(do.call(rbind, unlist(lapply(X2, function(x)
combn(x, 2, sort, FALSE)), recursive = FALSE)))
g = graph.data.frame(dat, directed = FALSE)
mydf = data.frame(as.matrix(get.adjacency(g)))
mydf = mydf[colSums(mydf) > 1]
ANS = sapply(mydf, function(x) t(combn(row.names(mydf)[which(x == 1)], 2)))
do.call(rbind, lapply(names(ANS), function(nm) data.frame(ANS[[nm]], nm)))
OR
mynames = unique(do.call(c, X2))
do.call(rbind,
lapply(mynames, function(x){
L = V(g)$name[unlist(adjacent_vertices(graph = g, v = x))]
if(length(L) >= 2){
setNames(data.frame(t(combn(L, 2)), x), c("P1", "P2", "P3"))
}else{
setNames(data.frame(NA, NA, x), c("P1", "P2", "P3"))
}
}))
source
share