Вот решение 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)