data.table 中组间项目的交集
Intersection of items between groups in a data.table
我有一个包含两列的 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]
下面的 table 没有正确的值,但它看起来像这样:
groups <- x[, .N, keyby = groupID][,groupID]; results <- CJ(groups, groups)
results[, intersectionLength := sapply(1:nrow(results), function(x) sample(5:10)[1])]
编辑
我如何将其应用于我的问题?
这是一个带有 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)))]
这是在翻转组的情况下删除重复项的另一个选项:
ans <- x[x, on=.(color), allow.cartesian=TRUE][groupID!=i.groupID,
.(intersectionLength=uniqueN(color)),
.(g1=pmin(groupID, i.groupID), g2=pmax(groupID, i.groupID))]
输出:
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
我有一个包含两列的 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]
下面的 table 没有正确的值,但它看起来像这样:
groups <- x[, .N, keyby = groupID][,groupID]; results <- CJ(groups, groups)
results[, intersectionLength := sapply(1:nrow(results), function(x) sample(5:10)[1])]
编辑
这是一个带有 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)))]
这是在翻转组的情况下删除重复项的另一个选项:
ans <- x[x, on=.(color), allow.cartesian=TRUE][groupID!=i.groupID,
.(intersectionLength=uniqueN(color)),
.(g1=pmin(groupID, i.groupID), g2=pmax(groupID, i.groupID))]
输出:
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