如何从先验 R 中提取信息(关联规则)

how to extract information from apriori R (association rules)

我正在 R 中进行一些关联规则挖掘,想提取结果以便构建报告 我的结果如下所示:

> inspect(rules[1:3])
  lhs          rhs                         support confidence lift
1 {apples} => {oranges}                    0.00029       0.24  4.4
2 {apples} => {pears}                      0.00022       0.18 45.6
3 {apples} => {pineapples} 0.00014         0.12  1.8

如何在此处提取 "rhs",即橙子、梨和菠萝的向量

进一步如何从摘要中提取信息,即

> summary(rules)

数据类型是"s4",当输出在列表中时提取没有问题等等。你如何做等价的? 一套 3 条规则

rule length distribution (lhs + rhs):sizes
2 
3 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      2       2       2       2       2       2 

我想从 "set of 3 rules"

中提取“3”

我已经使用“@”了 What does the @ symbol mean in R?

但是一旦我使用了它,我该如何将我的结果转化为一个向量,即

inspect(rules@rhs)
1 {oranges}
2 {pears}
3 {pineapples}

变成长度为3的字符向量

inspect 没有返回任何东西,只是打印它的输出。发生这种情况时,如果要将输出保存为字符串,可以使用函数 capture.output。例如,获取 rhs

data(Adult)
rules <- apriori(Adult, parameter = list(support = 0.4))
inspect(rules[1:3])
#   lhs    rhs                              support confidence lift
# 1 {}  => {race=White}                   0.8550428  0.8550428    1
# 2 {}  => {native-country=United-States} 0.8974243  0.8974243    1
# 3 {}  => {capital-gain=None}            0.9173867  0.9173867    1

## Capture it, and extract rhs
out <- capture.output(inspect(rules[1:3]))
gsub("[^{]+\{([^}]*)\}[^{]+\{([^}]*)\}.*", "\2", out)[-1]
# [1] "race=White"                   "native-country=United-States"
# [3] "capital-gain=None"           

但是,您似乎只能使用函数 rhs

rules 访问此信息
str(rhs(rules)@itemInfo)
# 'data.frame': 115 obs. of  3 variables:
#  $ labels   :Class 'AsIs'  chr [1:115] "age=Young" "age=Middle-aged" "age=Senior" "age=Old" ...
#  $ variables: Factor w/ 13 levels "age","capital-gain",..: 1 1 1 1 13 13 13 13 13 13 ...
#  $ levels   : Factor w/ 112 levels "10th","11th",..: 111 63 92 69 30 54 65 82 90 91 ...

一般来说,使用 str 查看对象是由什么构成的,这样您就可以决定如何提取组件。

回答你的第二个问题:length(rules)

现在关于你的第一个问题:

library("arules")
data("Adult")
## Mine association rules.
rules <- apriori(Adult,parameter = list(supp = 0.5, conf = 0.9, target = "rules"))
summary(rules)

l = length(rules)

everything = labels(rules)
#print(everything)

cut = unlist(strsplit(everything,"=> "))[seq(2,2*l,by=2)]
print(cut)

如果您有问题,请不要犹豫,这可能有点密集:-)

您可以将 RHS 提取为项目名称的字符向量(没有无关文本,如“=>”或大括号),如下所示:

rules@rhs@itemInfo$labels[rules@rhs@data@i+1]

rules@rhs@data@i中存储的索引值范围从0到唯一标签数减1。因此,索引标签需要添加“1”以避免尝试访问 rules@rhs@itemInfo$labels.

的第 0 个元素

也许在提出这个问题时这不是一个选项,但是有一个 DATAFRAME() 函数可以将 rules 对象转换为 data.frame,从中它更容易提取你想要的东西。您甚至可以让它排除大括号并在项目集中的项目之间设置您喜欢的任何分隔符。

从已接受的答案中借用示例,

data(Adult)
rules <- apriori(Adult, parameter = list(support = 0.4))

我们现在可以将它变成 data.frame 并做一些有用的事情:

rule_data <- DATAFRAME(rules, 
                       separate = TRUE, 
                       setStart = '', 
                       itemSep = ',', 
                       setEnd = '')

> str(rule_data)
'data.frame':   169 obs. of  6 variables:
 $ LHS       : Factor w/ 76 levels "","relationship=Husband",..: 1 1 1 1 2 3 2 3 3 3 ...
 $ RHS       : Factor w/ 7 levels "race=White","native-country=United-States",..: 1 2 3 4 5 6 7 7 1 2 ...
 $ support   : num  0.855 0.897 0.917 0.953 0.403 ...
 $ confidence: num  0.855 0.897 0.917 0.953 0.999 ...
 $ lift      : num  1 1 1 1 2.18 ...
 $ count     : int  41762 43832 44807 46560 19704 19704 19715 19899 20054 20003 ...

> rule_data$RHS[1:5]
[1] race=White                       
[2] native-country=United-States     
[3] capital-gain=None                
[4] capital-loss=None                
[5] marital-status=Married-civ-spouse