基于其他列的重叠值

时间:2013-03-12 01:28:21

标签: r dataframe

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

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_ids的数据表来解决这个问题,但是在将该数据表转换为仅限action_id的表时遇到了问题,如上所示。

我想过循环遍历所有数据,但是我正在处理数百万行 - 因为/ if循环在这里不够时间,所以我试图找到一个基于矢量的解决方案。 / p>

1 个答案:

答案 0 :(得分: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