Неясно, откуда берутся исходные данные, поэтому я предположил, что вы читаете данные в data.frame, как показано ниже:
x <- data.frame(V1 = c("a", "b", "c"),
V2 = c("b", "c", "d"),
V3 = c("c", "d", "e"),
V4 = c(NA, "f", "f"),
stringsAsFactors = FALSE
)
row.names(x) <- c("p1", "p2", "p3")
Первый шаг - создать комбинацию всех строк, которые нужно сравнить:
rowIndices <- t(combn(nrow(x), 2))
> rowIndices
[,1] [,2]
[1,] 1 2
[2,] 1 3
[3,] 2 3
Тогда мы можем использовать эту информацию в apply
с length()
и intersect()
, чтобы получить то, что вы хотите. Обратите внимание, что я также проиндексировал атрибут row.names()
data.frame x
, чтобы получить имена строк, которые вы хотели.
data.frame(row1 = row.names(x)[rowIndices[, 1]],
row2 = row.names(x)[rowIndices[, 2]],
overlap = apply(rowIndices, 1, function(y) length(intersect(x[y[1] ,], x[y[2] ,])))
)
Дает вам что-то вроде:
row1 row2 overlap
1 p1 p2 2
2 p1 p3 1
3 p2 p3 3