Как отсортировать правила ассоциации по левому или правому краю в R

У меня есть набор правил из априорного алгоритма. Сортировать их по лифту, уверенности или поддержке несложно:

rules.sorted = sort(rules, by="lift")

Но предположим, что у меня есть небольшой набор правил с несколькими разными элементами rhs. Я хотел бы просмотреть правила, отсортированные по этим элементам rhs (в алфавитном порядке). Есть ли способ сделать это?

Т.е. из этого:

    lhs       rhs support   confidence lift    
1   {A}    => {B} 0.3919252 0.9431280  1.930940
2   {B}    => {A} 0.3919252 0.8024194  1.930940
3   {E,C}  => {A} 0.3535204 0.7995546  1.924047
4   {F,I}  => {F} 0.3924175 0.9005650  1.868281
5   {H}    => {G} 0.4194978 0.9659864  1.864941
6   {C,D}  => {A} 0.3653373 0.7141482  1.718525

К этому:

    lhs       rhs support   confidence lift    

2   {B}    => {A} 0.3919252 0.8024194  1.930940
3   {E,C}  => {A} 0.3535204 0.7995546  1.924047
6   {C,D}  => {A} 0.3653373 0.7141482  1.718525
1   {A}    => {B} 0.3919252 0.9431280  1.930940
4   {F,I}  => {F} 0.3924175 0.9005650  1.868281
5   {H}    => {G} 0.4194978 0.9659864  1.864941

Вот пример правил, с которыми я работаю:

library(arules)
download.file("http://archive.ics.uci.edu/ml/machine-learning-databases/mushroom/agaricus-lepiota.data", "mush.data");
dataset = read.table("mush.data", header = F, sep=",", na.strings= "*")
tr <- as(dataset, "transactions")
param  = new("APparameter", "confidence" = 0.9, "support" = 0.7, "minlen"= 2L, "maxlen" = 2L, "target" = "rules") 
rules <-apriori(tr,param)
dput(rules)

person Ewa Janikowska    schedule 17.11.2016    source источник
comment
Когда я пытаюсь отсортировать по правой стороне, я получаю Error in '[.data.frame'(q, , pmatch(by, colnames(q)), drop = FALSE) : undefined columns selected   -  person Ewa Janikowska    schedule 17.11.2016
comment
Согласно ?sort из arules, метод работает только с measures stored in the association's slot quality, вы можете захотеть вместо этого подмножество своих правил, если заинтересованы в определенных элементах.   -  person mtoto    schedule 17.11.2016
comment
@Cath Я отредактировал свой вопрос, чтобы включить dput. @mtoto Я знаю, что могу подмножество с заданными правами, но мне пришлось бы делать это отдельно для каждого элемента. Я ищу более простой способ   -  person Ewa Janikowska    schedule 17.11.2016
comment
@Cath теперь вы можете просматривать данные   -  person Ewa Janikowska    schedule 17.11.2016
comment
@Cath pastebin.com/1i6Yue8u   -  person Ewa Janikowska    schedule 17.11.2016
comment
Объект класса «транзакции» - tr <- as(dataset, "transactions")   -  person Ewa Janikowska    schedule 17.11.2016
comment
Как видно из приведенного выше кода, это фрейм данных: dataset = read.table("mush.data", header = F, sep=",", na.strings= "*")   -  person Ewa Janikowska    schedule 17.11.2016


Ответы (2)


Извлеките основную информацию из вашего rules объекта во фрейм данных, например:

rules_info <-
  data.frame(
    LHS = labels(lhs(rules)), 
    RHS = labels(rhs(rules)),          
    quality(rules)
  )

Затем отсортируйте его как обычный фрейм данных:

rules_info[ order(rules_info$RHS), ]
person bergant    schedule 17.11.2016
comment
Спасибо, это то, что я искал! - person Ewa Janikowska; 18.11.2016
comment
Я хочу сделать что-то вроде того, что вы предложили. Но этот код преобразует rhs и lhs в коэффициенты, и фактические значения отображаются в виде строк. Я хочу, чтобы rhs и lhs отображались как наборы в rules_info фрейме данных. Является ли это возможным? - person Muhammad Adeel Zahid; 03.01.2019
comment
@MuhammadAdeelZahid используйте stringsAsFactors = FALSE при создании data.frame - person bergant; 07.01.2019

Раствор Берганта - именно то, что вам нужно. Я бы просто переупорядочил правила в объекте правил:

rules_sorted <- rules[order(labels(rhs(rules)))]

Теперь новый объект правил отсортирован.

person Michael Hahsler    schedule 17.11.2016