Рассчитать сходство в рамках данных по заданным c строкам (R) - PullRequest
1 голос
/ 30 апреля 2020

У меня есть кадр данных, который выглядит примерно так:

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

Я хочу иметь возможность определить, сколько раз Название появляется в разные даты. В приведенном выше примере «BB C News», «Peaky Blinders» и «Eastenders» все появятся 01.01.20 и 02.01.20. Таким образом, сходство между двумя датами составляет 60% (3 из 5 заголовков одинаковы для обеих дат).

Вероятно, также стоит упомянуть, что фактический фрейм данных намного больше и имеет 120 заголовков в день, и охватывает около 700 дней. Мне нужно сравнить «заголовки» каждой «даты» с предыдущей «датой», а затем вычислить их сходство. Таким образом, чтобы быть ясным, мне нужно определить сходство 01.01.20 с 01.02.20, 02.01.20 с 03.01.20, 03.01.20 с 04.01.20, и так на ...

Кто-нибудь знает, как я могу go сделать это? Моя конечная цель - использовать Tableau для визуализации сходства / различия во времени, но я боюсь, что такой расчет будет слишком сложным для этого конкретного программного обеспечения, и мне придется каким-то образом добавить его в реальные данные.

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Вот еще одна возможность. Вы можете создать простую функцию для вычисления сходства или другого индекса между группами. Затем разделите ваши данные по дате на список и 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
1 голос
/ 30 апреля 2020

Я придумал это решение. Однако я не уверен, как это будет работать, когда количество записей в день отличается (т.е. у вас есть 8 заголовков для дня n и 15 заголовков для дня n + 1). Я думаю, вы хотели бы нормализовать по отношению к дню с большим количеством записей. В любом случае, вот оно:

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
...