Мы можем использовать outer
для сравнения каждого значения ex$group
с самим собой.
outer(ex$group, ex$group, `==`)
# [,1] [,2] [,3] [,4] [,5]
#[1,] TRUE FALSE TRUE FALSE TRUE
#[2,] FALSE TRUE FALSE FALSE FALSE
#[3,] TRUE FALSE TRUE FALSE TRUE
#[4,] FALSE FALSE FALSE TRUE FALSE
#[5,] TRUE FALSE TRUE FALSE TRUE
Если нам нужно добавить имена строк и столбцов, мы можем сделать
matrix(outer(ex$group, ex$group, `==`), nrow = nrow(ex),
dimnames = list(ex$id, ex$id))
# id1 id2 id3 id4 id5
#id1 TRUE FALSE TRUE FALSE TRUE
#id2 FALSE TRUE FALSE FALSE FALSE
#id3 TRUE FALSE TRUE FALSE TRUE
#id4 FALSE FALSE FALSE TRUE FALSE
#id5 TRUE FALSE TRUE FALSE TRUE