Найдите длину пересечения между всеми парами переменных

У меня есть большой набор данных (около 130 столбцов), который выглядит так:

data <- data.frame(AA = c("Apple", "Banana", "0", "Cherry", "0"),
                   AB = c("0", "0", "Apple", "Cherry", "0"),
                   AC = c("0", "0", "0", "0", "Cherry"),
                   AD = c("Cherry", "0", "0", "Banana", "0"))

Может ли кто-нибудь помочь мне найти количество точных совпадений между всеми возможными парами столбцов? Вывод должен выглядеть примерно так:

> output
  AA_AB AA_AC AA_AD AB_AC AB_AD AC_AD
      3     2     3     2     2     2

Я пытался использовать length(intersect(data$AA, data$AB)), но не знаю, как применить это ко всему набору данных в рамках одной команды. Из поиска других запросов в Stackoverflow я также попытался сначала создать фрейм данных со всеми возможными парами столбцов, но я не мог понять, как на самом деле заставить мой вывод соответствовать исходным именам столбцов, чтобы затем применить функцию intersect.

N <- ncol(data)
combos <- expand.grid(1:N,1:N) %>%
  filter(!Var1==Var2)
combos <- combos[!duplicated(t(apply(combos[1:2], 1, sort))),]

person Djoustaine    schedule 08.11.2020    source источник


Ответы (1)


Вы можете использовать combn для создания комбинации имен столбцов и подсчета общих значений между ними, используя length и intersect.

val <- combn(names(data), 2, function(x) 
             length(intersect(data[[x[1]]], data[[x[2]]])))

names(val) <- combn(names(data), 2, paste0, collapse =  '_')
val
#AA_AB AA_AC AA_AD AB_AC AB_AD AC_AD 
#    3     2     3     2     2     2 
person Ronak Shah    schedule 08.11.2020