计算数据帧内特定行之间的相似性(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新闻"、"Peaky Blinders"one_answers"Eastenders"都出现在01/01/20和02/01/20。因此,这两个日期之间的相似性为60%(五分之三的标题在两个日期都相同(。

可能还值得一提的是,实际的数据帧要大得多,每天有120个标题,跨度约700天。我需要将每个"日期"的"标题"与前一个"日期"进行比较,然后计算它们的相似性。因此,为了清楚起见,我需要确定01/01/20与02/01/20、02/01/20与03/01/20、03/01/20与04/01/20的相似性,依此类推…

有人知道我该怎么做吗?我的最终目标是使用Tableau来可视化随着时间的推移的相似性/差异,但我担心这样的计算对于特定的软件来说太复杂了,我必须以某种方式将其添加到实际数据中。

这里还有另一种可能性。您可以创建一个简单的函数来计算组之间的相似性或其他索引。然后,按日期将数据框拆分为一个列表,并将自定义函数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

我已经想出了这个解决方案。然而,我不确定当每天的记录数量不同时(即,第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

相关内容

  • 没有找到相关文章

最新更新