假设我有一个像这样的数据框:
df <- data.frame(
D = c('A', 'B', 'C'),
Q = c('asd', 'reg', 'rt'),
id = I(list(c(124, 532, 78), c(1, 3, 532), c(2, 3, 78, 124, 1)))
)
还有一个这样的:
clusters <- data.frame(
g = I(list(c(124, 78, 1),c(2, 3, 89),c(532, 533)))
)
我想计算每个 id 列表中的元素在组 g1、g2、g3(簇中的每一行)中的次数(当它不止一次时)。所以基本上只要交集 > 1 就计算交集。
输出应该是:
df <- data.frame(
D = c('A', 'B', 'C'),
Q = c('asd', 'reg', 'rt'),
id = I(list(c(124, 532, 78), c(1, 3, 532), c(2,3,78))),
count = c(2, 0, 5)
)
我无法使用 for 循环来完成此操作,因为它会花费很长时间,因为我有 70k 行。
for 循环看起来像这样:
for row in df:
for group in clusters:
if group intersect row$id > 1
count=count+intersection
count=0
也许你可以试试这个
transform(
df,
count = rowSums(outer(id, clusters$g, \(...) mapply(\(...) length(intersect(...)), ...)))
)
这给出了
D Q id count
1 A asd 124, 532, 78 3
2 B reg 1, 3, 532 3
3 C rt 2, 3, 78.... 5