-3

我有一个包含两列的数据框:name 和 action_id。名称通常有多个 action_id,而 action_id 也与多个名称相关联,如下所示:

name action_id
Bob  1
Bob  2
Bob  3
Tom  2
Tom  1
Bill 1
Bill 3

这是我的问题:我正在尝试根据名称索引 action_ids 之间的重叠。因此,如果一个名称与两个 action_id 关联,而另一个名称与相同的两个 action_id 关联,则这两个 action_id 之间的重叠为 1。对于上面的数据,此函数将在 action_ids 1 和 2 之间返回 1,1介于 1 和 3 之间,其他潜在重叠为 0。我正在描绘一个包含所有潜在 action_id 重叠的数据表以及这些重叠的实例,如下所示:

  1 2 3
1 - 0 0 
2 1 - 0
3 1 0 -

我试图通过将数据框转换为索引与用户关联的所有 action_id 的数据表来解决此问题,但是在将该数据表转换为仅 action_id 表时遇到问题,如上所示。

我想过循环遍历所有数据,但我正在处理数百万行——for/if 循环在这里不够省时,所以我试图找到一个基于向量的解决方案。

4

1 回答 1

2

我认为这会以您想要的方式计算重叠:

overlap = function(df, id1, id2) {
  id_by_name = tapply(df$action_id, df$name, unique)
  ids_in_name = lapply(
    id_by_name,
    function(x) {
      all(c(id1, id2) %in% x)
    }
  )
  overlapping_names = names(ids_in_name)[unlist(ids_in_name)]
  if (length(overlapping_names) >= 2) {
    return(1)
  } else {
    return(0)
  }
}

输出:

> overlap(df, 1, 2)
[1] 1
> overlap(df, 2, 3)
[1] 0
于 2013-03-12T01:40:44.460 回答