我有一个包含两列的数据框: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>
答案 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