2016-03-17 6 views
2

Решения для поиска pairs, но как насчет троек?R Комбинированные комбинации элементов 3

Если у меня есть:

consumer=c(1,1,1,1,1,2,2,2,2,3,3,4,4,4,4,5) 
items=c("apple","banana","carrot","date","eggplant","apple","banana", 
     "fig","grape","apple","banana","apple","carrot","date", 
     "eggplant","apple") 
shoppinglists <- data.frame(consumer,items) 
table(shoppinglists) 

Есть простой способ найти большинство комбинаций троек? Например, троек «морковь» + «дата» + «баклажан», «яблоко» + «морковь» + «дата», «яблоко» + «морковь» + «баклажан» и «яблоко» + «дата» + «баклажаны» кажутся в двух списках (потребители 1 и 4).

Вы можете видеть, что есть много связанных для второго места с одним видом: A + B + C, A + B + D, A + B + E, B + C + D, B + C + E (потребитель 1); A + B + F, A + B + G (потребитель 2).

+0

Я ищу только вернуться случаи троек и есть результат дать мне список троек и сколько раз они кажутся – gregorio099

ответ

2

Вот ответ с data.table, который будет распространяться на четверки и т.д. довольно легко:

library(data.table); setDT(shoppinglists) 

#exclude if consumer didn't buy 3 goods 
shoppinglists[ , if (.N >= 3) 
    .(triplet = 
     #get the combinations 3 at a time; 
     # keep them as a list (simplify=FALSE) 
     # for easy post-manipulation with sapply 
     sapply(combn(items, 3, simplify = FALSE), 
      #**should be a better way...** 
      paste, collapse = ",")), 
    by = consumer 
    #now count the total frequency of each triplet 
    ][ , .N, by = triplet 
    #and sort to see the most frequent 
    ][order(-N)] 
#     triplet N 
# 1:  apple,carrot,date 2 
# 2: apple,carrot,eggplant 2 
# 3: apple,date,eggplant 2 
# 4: carrot,date,eggplant 2 
# 5: apple,banana,carrot 1 
# 6:  apple,banana,date 1 
# 7: apple,banana,eggplant 1 
# 8:  banana,carrot,date 1 
# 9: banana,carrot,eggplant 1 
# 10: banana,date,eggplant 1 
# 11:  apple,banana,fig 1 
# 12:  apple,banana,grape 1 
# 13:  apple,fig,grape 1 
# 14:  banana,fig,grape 1 

Для двойников, мы можем использовать combn(value, 2); для четырехместных, combn(value, 4) и т. д.

Замените order(-N) на N == max(N), чтобы исключить все, кроме самых частых.

Жаль, что мы не должны paste - collapse этого - я ожидал list() работать, но считая bylist колонка, по-видимому, не работает.

+0

Это полностью правила. Бесконечно благодарен! – gregorio099

+0

здесь [большой учебник для data.table] (http://www.r-bloggers.com/a-data-table-r-tutorial-by-datacamp-intro-to-dti-j-by/) если кто-то подобен мне и пытается понять, как работает этот ответ! – gregorio099

+1

@ gregorio099 еще лучше [список учебников] (https: // github.com/Rdatatable/data.table/wiki/Getting-started) от GitHub – MichaelChirico

1

Вы можете использовать пакет arules. Это стоит изучить, если вы делаете много этой работу, как это:

Обеспечивает инфраструктуру для представления, обработки и данных анализа транзакций и моделей (часто встречающихся наборов и ассоциативных правил). Также предоставляет интерфейсы для реализаций C алгоритмов объединения алгоритмов Apriori и Eclat C. Borgelt.

Вот решение, используя алгоритм Eclat:

# Set up the object you'll pass to eclat: 
tbl <- table(shoppinglists) 
itemList <- matrix(tbl) 
dim(itemList) <- dim(tbl) 
colnames(itemList) <- colnames(tbl) 

Теперь вы можете использовать eclat. Существует аргумент support для указания минимальной поддержки, необходимой для того, чтобы набор предметов считался частым. В этом случае вы хотите все независимо от частоты, поэтому вы можете установить support на 0. Вы получите предупреждение о том, что установка его на 0 может привести к нехватке памяти.

library(arules) 
d <- eclat(itemList, parameter = list(minlen = 3, maxlen = 3, support = 0)) 

Вы можете построить data.frame вы хотите, используя данные, содержащиеся в d. Сформировать количество транзакций в НИКАКИХ гарантий путем умножения поддержки (quality(d)) от общего количества сделок (info(d)$ntransactions):

d2 <- data.frame(items = labels(d), quality(d) * info(d)$ntransactions) 
names(d2)[2] <- "N" # to rename from "support" to "N" 
d2 
#      items N 
#1   {apple,fig,grape} 1 
#2  {banana,fig,grape} 1 
#3  {apple,banana,grape} 1 
#4  {apple,banana,fig} 1 
#5  {apple,date,eggplant} 2 
#6 {banana,date,eggplant} 1 
#7 {carrot,date,eggplant} 2 
#8 {apple,carrot,eggplant} 2 
#9 {banana,carrot,eggplant} 1 
#10 {apple,banana,eggplant} 1 
#11  {apple,carrot,date} 2 
#12  {banana,carrot,date} 1 
#13  {apple,banana,date} 1 
#14 {apple,banana,carrot} 1 
+0

Спасибо за ответ - это действительно интересно. Когда я пытаюсь это сделать с примером shoppinglists, я получаю те же результаты, что и вы, но когда я использую гораздо больший список, функция eclat только записывает/выводит два триплета. Вы знаете, что может происходить? – gregorio099

+1

@ gregorio099 Сообщите мне, если проблема с настройкой параметра 'support' решает проблему. – Jota

Смежные вопросы