计算跨特定行的数据帧内的相似性 (R)

Calculate similarity within a dataframe across specific rows (R)

我有一个看起来像这样的数据框:

df <- data.frame("index" = 1:10, "title" = c("Sherlock","Peaky Blinders","Eastenders","BBC News", "Antiques Roadshow","Eastenders","BBC News","Casualty", "Dragons Den","Peaky Blinders"), "date" = c("01/01/20","01/01/20","01/01/20","01/01/20","01/01/20","02/01/20","02/01/20","02/01/20","02/01/20","02/01/20"))

输出如下所示:

Index  Title              Date
1      Sherlock           01/01/20
2      Peaky Blinders     01/01/20
3      Eastenders         01/01/20
4      BBC News           01/01/20
5      Antiques Roadshow  01/01/20
6      Eastenders         02/01/20
7      BBC News           02/01/20
8      Casualty           02/01/20
9      Dragons Den        02/01/20
10     Peaky Blinders     02/01/20

我希望能够确定标题在不同日期出现的次数。在上面的示例中,"BBC News"、"Peaky Blinders" 和 "Eastenders" 都出现在 01/01/20 和 02/01/20。因此,两个日期之间的相似度为 60%(两个日期中 5 个标题中有 3 个是相同的)。

可能还值得一提的是,实际数据框要大得多,每天有 120 个标题,跨越大约 700 天。我需要将每个 "date" 的 "titles" 与前面的 "date" 进行比较,然后计算它们的相似度。所以要明确一点,我需要确定 01/01/20 与 02/01/20、02/01/20 与 03/01/20、03/01/20 与 04/01/20 的相似性,等等在...

有人知道我该怎么做吗?我的最终目标是使用 Tableau 随着时间的推移可视化 similarity/difference,但我担心这样的计算对于那个特定的软件来说太复杂了,我将不得不以某种方式将它添加到实际数据本身。

我想到了这个解决方案。但是,我不确定当每天的记录数不同时它会如何工作(即第 n 天有 8 个标题,第 n+1 天有 15 个标题)。我想你想对有更多记录的那一天进行标准化。无论如何,它来了:

divide <- split.data.frame(df, as.factor(df$date))
 similarity <- vector()
 for(i in 1:(length(divide)-1)){
   index <- sum((divide[[i]]$title) %in% divide[[i+1]]$title)/max(c(length(divide[[i]]$title), length((divide[[i+1]]$title))))
   similarity <- c(similarity, index)
 }
similarity

还有一种可能。您可以创建一个简单的函数来计算组之间的相似性或其他指标。然后,按日期将您的数据框拆分成一个列表,lapply 自定义函数到列表中的每个(最终结果将是一个列表)。

calc_similar <- function(i) {
  sum(s[[i]] %in% s[[i-1]])/length(s[[i-1]])
}

s <- split(df$title, df$date)

setNames(lapply(seq_along(s)[-1], calc_similar), names(s)[-1])

输出

$`2020-01-02`
[1] 0.6