我有一个如下所示的数据集:
它显示了哪家商店卖了哪些书。
df <- tribble( ~shop, ~book_id, "A", 1, "B", 1, "C", 2, "D", 3, "E", 3, "A", 3, "B", 4, "C", 5, "D", 1, )
在数据集中,
- 商店A卖1、3
- 商店B卖1、4
- 商店C卖2、5
- 商店D卖3、1
- 商店E只卖3
所以现在,我想计算这里的雅卡尔指数。例如,我们以商店A和商店B为例。A和B销售了三种不同的书(书1、书3、书4)。然而,只有一种产品是被两家商店都销售的(这是产品1)。所以,这里雅卡尔指数应该是33.3% (1/3)。
这是所需数据的样本:
df <- tribble( ~shop_1, ~shop_2, ~similarity, "A", "B", 33.3, "B", "A", 33.33, "A", "C", 0, "C", "A", 0, "A", "D", 100, "D", "A", 100, "A", "E", 50, "E", "A", 50,)
任何评论/帮助都非常感激!提前谢谢。
回答:
我不知道是否有专门的包,但你可以编写自己的函数。我猜你说的相似性是指类似这样的东西:
similarity <- function(x, y) { k <- length(intersect(x, y)) n <- length(union(x, y)) k / n}
然后你可以使用tidyr::crossing
来合并相同的数据框与自身
dfg <- df %>% group_by(shop) %>% summarise(books = list(book_id))crossing(dfg %>% set_names(paste0, "_A"), dfg %>% set_names(paste0, "_B")) %>% filter(shop_A != shop_B) %>% mutate(similarity = map2_dbl(books_A, books_B, similarity))