Пересечение элементов между группами в таблице данных - PullRequest
2 голосов
/ 10 марта 2020

У меня есть data.table с двумя столбцами, один с groupID, а другой с color. Я хочу найти длину пересечений или операцию попарного пересечения между всеми группами. В Интернете есть похожие посты, но ничего такого, что я ищу.

require(data.table)


set.seed(1)
x <- data.table(
  groupID = paste0(sample(LETTERS), sample(LETTERS, replace = TRUE)),
  color = sapply(1:length(LETTERS), function(x) sample(colors()[1:10])[1:sample(5:10)[1]])
)

x <- x[, .(color = unlist(color)), keyby = groupID]

Таблица ниже не имеет правильных значений, но выглядела бы она примерно так:

groups <- x[, .N, keyby = groupID][,groupID]; results <- CJ(groups, groups)
results[, intersectionLength := sapply(1:nrow(results), function(x) sample(5:10)[1])]

EDIT

В этом посте есть похожий вопрос. Как я могу применить это к моей проблеме?

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Вот еще один вариант удаления дубликатов в случае переворачивания групп:

ans <- x[x, on=.(color), allow.cartesian=TRUE][groupID!=i.groupID, 
    .(intersectionLength=uniqueN(color)), 
    .(g1=pmin(groupID, i.groupID), g2=pmax(groupID, i.groupID))]

output:

     g1 g2 intersectionLength
  1: AT AT                  6
  2: AT CZ                  3
  3: AT DO                  6
  4: AT EW                  5
  5: AT FT                  4
 ---                         
347: XL YL                  3
348: XL ZF                  6
349: YL YL                  5
350: YL ZF                  3
351: ZF ZF                  7
0 голосов
/ 10 марта 2020

Вот один вариант с Map для сравнения попарных элементов групповых столбцов для извлечения значений intersect ing 'color' и получения length этого

library(data.table)
CJ(group1 = unique(x$groupID), group2 = unique(x$groupID))[,
   .(group1, group2, intersectionLength = unlist(Map(function(u, v) 
   length(intersect(x$color[x$groupID == u], 
      x$color[x$groupID == v])), group1, group2)))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...