Подсчет частот с помощью dplyr

#r #dplyr #grouping

#r #dplyr #группировка

Вопрос:

У меня есть фрейм данных с двумя столбцами id_1 и id_2. Для каждого из id_1 я хочу подсчитать количество совпадений, которые он имеет со всеми элементами id_2.

Я полагаю, что результатом является фрейм данных со столбцами id_1, id_2 и number_of_id_2_found_for_id_1.

Вот что я пытаюсь

 set.seed(1)
df <- data.frame(
  id_1 = sample(1:10, size = 30, replace = TRUE),
  id_2 = sample(1:10, size = 30, replace = TRUE)
)

df %>% group_by(id_1, id_2) %>%
  # id_1 should be unique
  summarise(~n(.x)) # I want this to be the number of id_2 it has found for each of the elements of id_1
 

Мой ожидаемый результат будет:

1 1 0
1 2 0
1 3 0
1 4 1
1 5 0
….
1 9 0
2 1 0

2 7 1
2 8 0
2 9 1

И так далее, в основном для каждого id_1 количество элементов, которые он нашел для each_id_2. В приведенном выше примере это в основном 1, но в гораздо большем фрейме данных количество увеличится. Это похоже на двудольный граф, где ребром будет количество совпадений слева направо между первым компонентом — id_1 и id_2.

Заранее спасибо!

Комментарии:

1. Извините, опечатка. Исправил это только сейчас.

2. Из начального числа, о котором вы упомянули, я получаю строку для 1 3

Ответ №1:

Основываясь на обновленном сообщении, может быть, нам нужно сделать a crossing , чтобы вернуть все комбинации, выполнить a count для исходного набора данных для обоих столбцов и объединить с полной комбинацией

 library(dplyr)
library(tidyr)
crossing(id_1 = 1:10, id_2 = 1:10)  %>% 
  left_join(., df %>% 
                  count(id_1, id_2)) %>%
  mutate(n = replace_na(n, 0))
 

-вывод

 # A tibble: 100 x 3
#    id_1  id_2     n
#   <int> <int> <dbl>
# 1     1     1     0
# 2     1     2     0
# 3     1     3     1
# 4     1     4     1
# 5     1     5     0
# 6     1     6     0
# 7     1     7     0
# 8     1     8     0
# 9     1     9     1
#10     1    10     0
# … with 90 more rows
 

Комментарии:

1. Я действительно хочу посмотреть, что это за элемент, то есть фрейм данных id_1, id_2, number_of_id_2_found_for_id_1

2. Это дает фрейм данных с двумя столбцами, мне нужен фрейм данных с 3 столбцами — уникальным id_1, id_2 и количеством совпадений id_2 для этого id_1.

3. Я добавил редактирование с тем, как я представляю себе конечный результат

4. @Nikola Спасибо, я этого не заметил. Пожалуйста, укажите, когда вы его редактируете. Спасибо

5. @Nikola я добавил решение. Без полного ожидаемого результата я просто предполагаю, что это может быть тот результат, который вы хотели