Generando una lista de borde desde ID y agrupando vectores

Tengo un marco de datos de más de 205,000 filas formateadas de la siguiente manera:

df <- data.frame(project.id = c('SP001', 'SP001', 'SP001', 'SP017', 'SP018', 'SP017'),
                 supplier.id = c('1224', '5542', '7741', '1224', '2020', '9122'))

En el marco de datos real hay más de 6700 valores únicos deproject.id. Me gustaría crear una lista de borde que empareje a los proveedores que han trabajado en el mismo proyecto.

Resultado final deseado paraproject.id = SP001:

to     from
1224   5542
1224   7741
5542   7741

Hasta ahora he intentado usarsplit para crear una lista por project.id y luego ejecutarlapply+combn para generar todas las combinaciones posibles desupplier.id dentro de cada lista / grupo:

try.list <- split(df, df$project.id)
try.output <- lapply(try.list, function(x) combn(x$supplier.id, 2))

¿Existe una forma más elegante / eficiente (léase "calculada en menos de 2 horas") para generar algo como esto?

Cualquier ayuda sería muy apreciada

Respuestas a la pregunta(3)

Su respuesta a la pregunta