来自 spmf 的关联规则中的 R 子集

Posted

技术标签:

【中文标题】来自 spmf 的关联规则中的 R 子集【英文标题】:R subset in association rules from spmf 【发布时间】:2014-08-01 08:36:28 【问题描述】:

代码:

data=read.csv("./spmf1234.csv",header=F);

df<- data.frame(do.call('rbind', strsplit(as.character(data$V1),'#',fixed=F)));

df2<- data.frame(do.call('rbind', strsplit(as.character(df$X1),'==>',fixed=F)));

df3=cbind(df2,df);

colnames(df3)=c("lhs","rhs","rule","support","confidence","lift");

df4 <- subset(df3, select = c(lhs,rhs,support,confidence,lift));

final=subset(df4,lhs!=1);

我正在使用 fp-growth 从 spmf 获得的 csv 文件上尝试上述代码以获取关联规则。我希望删除所有在 lhs 中具有“1”的规则,但这不起作用。

csv 文件:

2 ==> 1 #SUP: 1 #CONF: 0.33333 #LIFT: 0.66667

1 ==> 2 #SUP: 1 #CONF: 0.33333 #LIFT: 0.66667

3 ==> 1 #SUP: 2 #CONF: 0.5 #LIFT: 1

1 ==> 3 #SUP: 2 #CONF: 0.66667 #LIFT: 1

3 ==> 2 #SUP: 2 #CONF: 0.5 #LIFT: 1

2 ==> 3 #SUP: 2 #CONF: 0.66667 #LIFT: 1

2 3 ==> 1 #SUP: 1 #CONF: 0.5 #LIFT: 1

1 3 ==> 2 #SUP: 1 #CONF: 0.5 #LIFT: 1

1 2 ==> 3 #SUP: 1 #CONF: 1 #LIFT: 1.5

3 ==> 1 2 #SUP: 1 #CONF: 0.25 #LIFT: 1.5

2 ==> 1 3 #SUP: 1 #CONF: 0.33333 #LIFT: 1

1 ==> 2 3 #SUP: 1 #CONF: 0.33333 #LIFT: 1

【问题讨论】:

【参考方案1】:
final=subset(df4,lhs!=1) 

将字符与数字进行比较,这不起作用:

# > as.character(df4$lhs)
# [1] "2 "   "1 "   "3 "   "1 "   "3 "   "2 "   "2 3 " "1 3 " "1 2 " "3 "   "2 "   "1 "  

你可能想使用像这样的正则表达式:

final = subset(df4, !grepl("1\\b", lhs))
# > final
#    lhs   rhs support     confidence          lift
# 1    2     1  SUP: 1  CONF: 0.33333  LIFT: 0.66667
# 3    3     1  SUP: 2      CONF: 0.5        LIFT: 1
# 5    3     2  SUP: 2      CONF: 0.5        LIFT: 1
# 6    2     3  SUP: 2  CONF: 0.66667        LIFT: 1
# 7  2 3     1  SUP: 1      CONF: 0.5        LIFT: 1
# 10   3   1 2  SUP: 1     CONF: 0.25      LIFT: 1.5
# 11   2   1 3  SUP: 1  CONF: 0.33333        LIFT: 1

添加:

## data preperation
data <- readLines(con = textConnection("  
2 ==> 1 #SUP: 1 #CONF: 0.33333 #LIFT: 0.66667
1 ==> 2 #SUP: 1 #CONF: 0.33333 #LIFT: 0.66667
3 ==> 1 #SUP: 2 #CONF: 0.5 #LIFT: 1
1 ==> 3 #SUP: 2 #CONF: 0.66667 #LIFT: 1
3 ==> 2 #SUP: 2 #CONF: 0.5 #LIFT: 1
2 ==> 3 #SUP: 2 #CONF: 0.66667 #LIFT: 1
2 3 ==> 1 #SUP: 1 #CONF: 0.5 #LIFT: 1
1 3 ==> 2 #SUP: 1 #CONF: 0.5 #LIFT: 1
1 2 ==> 3 #SUP: 1 #CONF: 1 #LIFT: 1.5
3 ==> 1 2 #SUP: 1 #CONF: 0.25 #LIFT: 1.5
2 ==> 1 3 #SUP: 1 #CONF: 0.33333 #LIFT: 1
1 ==> 2 3 #SUP: 1 #CONF: 0.33333 #LIFT: 1"))
r <- regexec(pattern = "([0-9 ]+)\\s==>\\s([0-9 ]+)\\s\\#SUP:\\s([0-9.]+)\\s\\#CONF:\\s([0-9.]+)\\s\\#LIFT:\\s([0-9.]+)", 
             text = data)
m <- regmatches(data, r)
df <- setNames(as.data.frame(do.call(rbind, lapply(m, "[", -1)), stringsAsFactors = FALSE), 
               c("lhs", "rhs", "support", "confidence", "lift"))

## rows to include/exclude
include <- sapply(strsplit(df$lhs, " "), function(x) !any(as.integer(x) %in% 1:1000))
df[include, ]

【讨论】:

谢谢,这真的很有帮助。只有一个问题,如果我使用这种方法并且不想在 lhs(或 rhs)中包含数字列表,那么我必须在一次传递一个数字的循环中使用它。有没有其他更有效的方法来传递我不想包含在 lhs(或 rhs)中的完整数字列表 您可以用管道(或运算符)分隔数字列表。例如。 !grepl("\\b1\\b|\\b2\\b", lhs) 将排除 12\\b 是单词边界标记:regular-expressions.info/wordboundaries.html 我正在尝试循环使用以下内容。请帮助:for(i in 0:1000) df2 = subset(df1, !grepl("\\bi\\b", lhs)) df1=df2 你最后想要完成什么? for 循环对我来说在很多方面都没有意义,从 paste0("\\b", i, "\\b") 而不是 "\\b1\\b|\\b2\\b" 开始。 我想从数据集中删除所有这些行,其中包含 1,2,3 ... 直到 1000。

以上是关于来自 spmf 的关联规则中的 R 子集的主要内容,如果未能解决你的问题,请参考以下文章

多维关联规则挖掘算法r语言能实现吗

R中的关联规则:如何根据项目选择规则?

R语言apriori算法进行关联规则挖掘(限制规则的左侧或者右侧的内容进行具体规则挖掘)使用subset函数进一步筛选生成的规则去除左侧规则中的冗余信息获取更独特的有新意的关联规则

R中的关联规则没有足够的RAM [关闭]

r语言关联规则为啥只产生了1条规则

r apriori算法结果怎么看