Групповое перекрытие в R (доля рынка / корреляции) - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть данные уровня пользователя в R, которые показывают различные группы, с которыми взаимодействовал пользователь. Что я хотел бы выяснить, так это совпадение между этими группами. У меня есть образец данных ниже:

Group UserID
A     User1
B     User1
D     User1
A     User2

Как вы можете видеть, Пользователь1 взаимодействовал с 3 группами, а Пользователь2 взаимодействовал только с Группой А. Что я хотел бы узнать, так это «рынок» доля "пользователей каждой группы. Например, может оказаться, что в Группе A было 100 000 пользователей, которые ТОЛЬКО взаимодействовали с Группой A, 10000, которые взаимодействовали с A & B, 5000, которые взаимодействовали с A, B и C, et c. Очевидно, существует множество комбинаций.

Есть ли способ рассчитать это с помощью tidyr / dplyr? Есть ~ 1 миллион пользователей и 600 групп. Каждый пользователь может взаимодействовать с некоторыми группами, но не со всеми.

Спасибо!

1 Ответ

2 голосов
/ 07 февраля 2020

Если вы хотите знать только количество других взаимодействий, это сработает:

df <- data.frame(Group = c("A", "B", "D", "A", "C", "D", "D", "B", "C"),
                 UserID = c("User1", "User1", "User1", "User2", "User2", "User3", "User4", "User5", "User5"))


library(tidyverse)

df %>% 
  group_by(Group, UserID) %>% # make sure there are no double entries
  summarise() %>%             # make sure there are no double entries
  group_by(UserID) %>%
  mutate(NGroups = n()) %>%   # how many interactions has this user
  ungroup() %>% 
  group_by(Group, NGroups) %>% 
  summarise(N = n()) %>%      # count for each Group - NInteractions combination the frequency
  ungroup() %>% 
  pivot_wider(names_from = NGroups, values_from = N)

Если вы хотите подсчитать количество для каждой отдельной комбинации групп, вам следует начать;):

df %>% 
  group_by(Group, UserID) %>% 
  summarise() %>% 
  group_by(UserID) %>%
  mutate(GroupsString = paste0(Group, collapse="")) %>% 
  ungroup() %>% 
  group_by(Group, GroupsString) %>% 
  summarise(N = n()) %>% 
  ungroup()
...