我有一个看起来像这样的数据框:
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”和“ Eastenders”都出现在01/01/20和02/01/20上。因此,两个日期之间的相似度为60%(两个日期中5个标题中的3个相同)。
可能值得一提的是,实际的数据框要大得多,每天有120个标题,跨度约700天。我需要将每个“日期”的“标题”与上一个“日期”进行比较,然后计算它们的相似度。为了清楚起见,我需要确定01/01/20与02/01 / 20、02 / 01/20与03/01 / 20、03 / 01/20与04/01/20的相似性,依此类推在...
有人知道我该怎么做吗?我最终的目标是使用Tableau可视化一段时间内的相似性/差异,但是我担心这样的计算对于该特定软件来说太复杂了,我将不得不以某种方式将其添加到实际数据本身中。
我想出了这个解决方案。但是,我不确定当每天的记录数不同时它将如何工作(即,第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
这里是另一种可能性。您可以创建一个简单的函数来计算组之间的相似度或其他索引。然后,按日期将数据框分成一个列表。然后将自定义函数应用于列表中的每个函数(结果将是一个列表)。
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