Подсчет комбинаций по группам в R - PullRequest
0 голосов
/ 14 ноября 2018

Мои данные настроены как

df=data.frame(ID=c('A', 'A','A','B','B','C','C','C', 'C', 'C','D', 'E', 'E'),
                    drink_freq = c('Coffee Light', 'Water Heavy', 'Tea Medium',
                                   'Coffee Medium', 'Water Light', 
                                   'Espresso Light', 'Coffee Medium', 'Water Light', 'Soda Light', 'Tea Medium',
                                   'Coffee Heavy',
                                   'Coffee Medium', 'Soda Light'))

И что я хотел бы сделать, так это создать некую таблицу непредвиденных обстоятельств, которая показывает частоту комбинаций различных сегментов, частью которых может быть пользователь. Так, например ... Soda Light-Coffee Medium и Coffee Medium-Water Light были бы 2, тогда как Coffee Light-Water Heavy были бы 1.

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

1 Ответ

0 голосов
/ 14 ноября 2018

Вот решение tidyverse, которое создает все уникальные комбинации напитков (т.е. учитывается порядок напитков) и подсчитывает, сколько у них обычных пользователей:

df=data.frame(ID=c('A', 'A','A','B','B','C','C','C', 'C', 'C','D', 'E', 'E'),
              drink_freq = c('Coffee Light', 'Water Heavy', 'Tea Medium',
                             'Coffee Medium', 'Water Light', 
                             'Espresso Light', 'Coffee Medium', 'Water Light', 'Soda Light', 'Tea Medium',
                             'Coffee Heavy',
                             'Coffee Medium', 'Soda Light'), stringsAsFactors = F)

library(tidyverse)

data.frame(t(combn(unique(df$drink_freq), 2)), stringsAsFactors = F) %>%
  mutate(counts = map2_dbl(X1, X2, ~length(intersect(df$ID[df$drink_freq==.x], 
                                                     df$ID[df$drink_freq==.y]))))

#                X1             X2 counts
# 1    Coffee Light    Water Heavy 1
# 2    Coffee Light     Tea Medium 1
# 3    Coffee Light  Coffee Medium 0
# 4    Coffee Light    Water Light 0
# 5    Coffee Light Espresso Light 0
# 6    Coffee Light     Soda Light 0
# 7    Coffee Light   Coffee Heavy 0
# 8     Water Heavy     Tea Medium 1
# 9     Water Heavy  Coffee Medium 0
# 10    Water Heavy    Water Light 0
# 11    Water Heavy Espresso Light 0
# 12    Water Heavy     Soda Light 0
# 13    Water Heavy   Coffee Heavy 0
# 14     Tea Medium  Coffee Medium 1
# 15     Tea Medium    Water Light 1
# 16     Tea Medium Espresso Light 1
# 17     Tea Medium     Soda Light 1
# 18     Tea Medium   Coffee Heavy 0
# 19  Coffee Medium    Water Light 2
# 20  Coffee Medium Espresso Light 1
# 21  Coffee Medium     Soda Light 2
# 22  Coffee Medium   Coffee Heavy 0
# 23    Water Light Espresso Light 1
# 24    Water Light     Soda Light 1
# 25    Water Light   Coffee Heavy 0
# 26 Espresso Light     Soda Light 1
# 27 Espresso Light   Coffee Heavy 0
# 28     Soda Light   Coffee Heavy 0

Затем вы можете изменить вышеприведенный вывод в таблицу непредвиденных расходов.

Обратите внимание , что если вы хотите изменить форму и получить симметричный вывод, вы должны изменить приведенный выше код, чтобы игнорировать порядок напитков, создавая все возможные комбинации, например:

expand.grid(X1=unique(df$drink_freq),
            X2=unique(df$drink_freq), stringsAsFactors = F) %>%
  mutate(counts = map2_dbl(X1, X2, ~length(intersect(df$ID[df$drink_freq==.x], 
                                                     df$ID[df$drink_freq==.y])))) %>% 
  filter(X1 != X2) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...