Я пытаюсь объединить свои данные, чтобы найти корреляции / шаблоны, и хочу выяснить, как и где данные могут коррелировать. В частности, я хочу определить, сколько раз идентификатор (здесь называемый «элемент») появляется вместе. Есть ли способ узнать, сколько раз каждый (id) появляется вместе в строке?
Это для более крупного data.frame, который уже был очищен и агрегирован на основе этого конкретного запроса. В прошлом я пытался применить несколько функций агрегации, суммирования и фильтрации из таких пакетов, как «data.table», «dplyr» и «tidyverse», но не могу получить то, что ищу.
В разделе 3 ( Показать код ) я привел минимальный воспроизводимый пример:
set.seed(1234)
random.people<-c("Bob","Tim","Jackie","Angie","Christopher")
number=sample(12345:12350,2000,replace = T)
item=sample(random.people,2000,replace=T)
sample_data <- data.frame(cbind(number,item), stringsAsFactors = FALSE)
Используя примеры здесь , я ожидал, что вывод идентифицирует все комбинации, где имена были объединены в число, и покажет n (значение) - ожидаемые результаты будут напоминать что-то вроде:
Pair value
Bob, Tim 2
Bob, Jackie 4
Bob, Angie 0
Этот вывод (что я надеюсь получить) скажет мне, что во всем дф есть 2 раза Боб и Тим и 4 раза Боб и Джеки оба иметь тот же номер.
но фактический результат:
Error: Each row of output must be identified by a unique combination of keys.
Keys are shared for 2000 rows:
* 9, 23, 37, 164, 170, 180, 211...
Обновление: я подумал о ... творческом (?) Решении - но надеюсь, что кто-то может помочь с его ускорением. Я могу найти все числа (column1), которые разделены между двумя именами, используя следующее:
x1<-sample_data %>% dplyr::filter(item=="Bob")
x2<-sample_data %>% dplyr::filter(item=="Tim")
Bob<-x1[,1]
Tim<-x2[,1]
Reduce(intersect, list(Bob,Tim))
выход:
[1] "12345" "12348" "12350" "12346" "12349" "12347"
Как я уже сказал, это занимает много времени и потребует создания множества векторов и пересечения каждого (например, 1 вектор для каждого имени) и нескольких комбинаций.