Сопоставление правила ассоциации с исходными записями

Я использую следующий код и получаю соответствующие правила ассоциации:

library("arules")
data("Adult")
    rules <- apriori(Adult,parameter = list(supp = 0.5, conf = 0.9, target = "rules"))
  labels(rules)

Есть 50 правил. Я хотел бы вернуться к исходным данным:

Adult3<-as.data.frame(as(Adult,"matrix"))

И добавить новый столбец в Adult3$RUL_NUM. Этот столбец будет включать значение соответствующего правила (в данном случае от 1 до 50), которому соответствует запись (для каждой записи). Если на запись приходится более одного правила, я хотел бы добавить последнее правило, которому запись соответствует.


person Avi    schedule 05.06.2016    source источник


Ответы (1)


Возможно, вы захотите изучить функцию is.superset. Например

is.superset(Adult, lhs(rules))

предоставит вам логическую матрицу, которая указывает для каждой транзакции, какое правило является «актуальным» (т. е. где присутствуют все элементы в LHS).

Изменить: если вы хотите, чтобы правило соответствовало всему, используйте код Avi, предложенный ниже:

is.superset(Adult, lhs(rules))

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

w <- sapply(apply(is.superset(Adult, rules), MARGIN = 1, which), tail, n = 1)

Этот код находит индекс столбца всех единиц в каждой строке, а затем возвращает последний.

person Michael Hahsler    schedule 06.06.2016
comment
Спасибо, Майкл. Я хотел бы просто добавить номер (от 1 до 50 количества правил в данном случае) к каждой строке данных (в данном случае для взрослых). Число является релевантным правилом для конкретной строки. Может ли ваше решение предоставить конкретный номер правила для каждой строки? - person Avi; 06.06.2016
comment
Михаил, я думаю, ваше решение следует изменить. Так как для одного и того же LHS могут быть разные RHS. И я хотел бы сопоставить для каждой строки правило, которое ей соответствует (как если бы мы запускали выборку в sql для каждого правила и проверяли для каждой строки, является ли она его подмножеством). У некоторых правил одинаковая левая сторона, но другая правая сторона, и мы должны это учитывать. Поэтому я думаю, что ваше решение должно быть is.superset(Adult, (rules)) - person Avi; 06.06.2016
comment
Спасибо большое Михаил! Оно работает! У меня есть 2 замечания. Мой исходный файл содержит 1712 строк (1713 с заголовком), и это фрейм данных, который я преобразовал в транзакции и использовал: w ‹- sapply(apply(is.superset(mytrans, rules), MARGIN = 1, which), tail, n = 1), затем я преобразовал w обратно в dataframe: df ‹- data.frame(matrix(unlist(w), byrow=T),stringsAsFactors=FALSE) Однако теперь у меня всего 1256 строк. Я думаю, что пробел (456) возникает из-за исходных строк без соответствующего правила - с именем целое число (0). Есть ли способ сохранить в df исходный номер строки со значением пробела в случае отсутствия номера правила? - person Avi; 07.06.2016
comment
@Avi: я не думал об этом. Я думаю, вам нужно заменить целое число (0) на NA, прежде чем вы сделаете удаление из списка. - person Michael Hahsler; 09.06.2016