在R中打包arules:获取左侧只有一个项目的规则

时间:2013-05-21 11:26:21

标签: r arules

我在R中使用包arules来生成关联规则。我想要 限制规则,以便在左侧只有一个 特别的元素,我们称之为“potatoe”。

如果我这样做:

rules <- apriori(dtm.mat, parameter = list(sup = 0.4, conf =
0.9,target="rules"), appearance = list(lhs = c("potatoe")))

我在lhs上获得“potatoe”,但也包括所有其他类型的东西。我怎么能够 强制规则只包含一个元素?参数maxlen不行 我想要什么,因为,据我所知,我不能指定maxlen 适用于左侧的元素。

4 个答案:

答案 0 :(得分:6)

假设您已生成规则(问题中的“规则”),以下是如何对其进行子集化。基本上,您必须将数据强制转换为数据框,然后对其进行子集化。

#Here are the original rules generated with some data I created
# categories are "G", "T", "D", and "potatoe"

> inspect(rules);
lhs        rhs      support    confidencelift
1  {}  => {T}       0.3333333  0.3333333 1.0000000
2  {}  => {G}       0.5000000  0.5000000 1.0000000
3  {}  => {potatoe} 0.5000000  0.5000000 1.0000000
4  {}  => {D}       0.5000000  0.5000000 1.0000000
5  {T} => {G}       0.1666667  0.5000000 1.0000000
6  {G} => {T}       0.1666667  0.3333333 1.0000000
7  {T} => {D}       0.1666667  0.5000000 1.0000000
8  {D} => {T}       0.1666667  0.3333333 1.0000000
9  {G} => {potatoe} 0.1666667  0.3333333 0.6666667
10 {potatoe} => {G} 0.1666667  0.3333333 0.6666667
11 {potatoe} => {D} 0.3333333  0.6666667 1.3333333
12 {D} => {potatoe} 0.3333333  0.6666667 1.3333333

#Coerce into data frame
as(rules, "data.frame");

#Restrict LHS to only certain value (here, "potatoe")
rules_subset <- subset(rules, (lhs %in% c("potatoe")));

#Check to see subset rules
inspect(rules_subset);
lhs            rhs support    confidencelift
1 {potatoe} => {G} 0.1666667  0.3333333 0.6666667
2 {potatoe} => {D} 0.3333333  0.6666667 1.3333333

此方法还允许任意多个LHS值,而不仅仅是一个。比我之前提出的答案容易得多。

答案 1 :(得分:4)

Mate,您只需在外观参数列表中添加default="rhs",就可以了。

rules <- apriori(dtm.mat, parameter = list(sup = 0.4, conf =
0.9,target="rules"), appearance = list(lhs = c("potatoe"), default="rhs"))

lhs=c("potatoe")参数告诉算法LHS应该只包含“potatoe”,default="rhs"参数告诉算法RHS应该是默认值(即不应用约束)有)。

答案 2 :(得分:0)

subset()函数提供了一种搜索事务,项或规则子集的方法。

private void setBordersToMergedCells(HSSFSheet sheet) {
    int numMerged = sheet.getNumMergedRegions();
    for (int i = 0; i < numMerged; i++) {
        CellRangeAddress mergedRegions = sheet.getMergedRegion(i);
        RegionUtil.setBorderLeft(BorderStyle.THIN, mergedRegions, sheet);
        RegionUtil.setBorderRight(BorderStyle.THIN, mergedRegions, sheet);
        RegionUtil.setBorderTop(BorderStyle.THIN, mergedRegions, sheet);
        RegionUtil.setBorderBottom(BorderStyle.THIN, mergedRegions, sheet);

    }
}

答案 3 :(得分:-6)

这是一种方法:

  
      
  1. 使用inspect()生成规则列表。
  2.   
  3. 将所有规则复制到文本编辑器中。
  4.   
  5. 另存为.txt文件。
  6.   
  7. 在excel中打开,作为固定宽度分隔文件。
  8.   
  9. 过滤LHS只包括“potatoe”[sic]。
  10.   

可能有一种更简单的方法,但至少你不必在左侧手动搜索“potatoe”[原文如此]。