悬赏 1 个论坛币 未解决
apriori<-function(data,minsup){
#找出频繁项集的函数
freItem<-function(data,m1,minsup,k){
m2<-matrix(0,ncol=k+3)
k1<-k+2
#候选集
if(!is.null(m1))
for(i in 1:(nrow(m1)-1))
for(j in (i+1):nrow(m1))
if(sum(m1[i,1:(k+1)]%in% m1[j,1:(k+1)])==k){
a<-c(union(m1[i,1:(k+1)],m1[j,1:(k+1)]),0)
#去掉可能出现的重复元组
if(!all(a %in% m2))
m2<-rbind(m2,a)
}
m2<-m2[-1,]
#剪枝
a<-array()
num<-1
if(!is.null(m2))
for(i in 1:nrow(m2)){
aa<-m2[i,1:k1]
#combn:列出所有元素的组合
combination<-combn(aa ,k1)
for(t in 1:ncol(combination)){
if(!any(combination[,t]!=m1)){
a[num]=i
num=num+1
}
}
}
if(is.numeric(a[1]))
m2<-m2[-a,]
#计算支持度
if(is.null(m2))
return(m2)
else{
for(i in 1:nrow(m2))
for(j in 1:length(data)){
b<-0
for(t in 1:k1){
b<-b+sum(m2[i,t] == data[[j]])
}
if(b==k1)
m2[i,k+3]=as.numeric(m2[i,k+3])+1
}
}
#提取大于最小支持度的行
m2<-m2[m2[,(k+3)]>=minsup,]
return(m2)
}
#频繁1项集
m<-matrix(0,ncol=2,byrow=T)
#找出频繁候选1项集
for(i in 1:length(data))
for(j in 1:length(data[]))
if(any(m == data[][j]))
m[which(m==data[][j]),2]<-as.numeric(m[which(m==data[][j]),2])+1
else {
#添加新元素
a<-matrix(c(data[][j],1),nrow=1)
m<-rbind(m,a)
}
#提取大于最小支持度的元素
m<-m[-1,]
m1<-m[m[,2]>=minsup,]
#频繁n项集
m2<-m1
k<-0
' while(!is.null(m2)){
m2<-freItem(data,m2,2,k)
k<-k+1
}
'
m2<-freItem(data,m2,2,0)
m2<-freItem(data,m2,2,1)
return(m2)
}
list1<-list(T100=c("I1","I2","I5"),T200=c("I2","I4"),T300=c("I2","I3"),T400=c("I1","I2","I4"),T500=c("I1","I3"),
T600=c("I2","I3"),T700=c("I1","I3"),T800=c("I1","I2","I3","I5"),T900=c("I1","I2","I3"))
result<-apriori(list1,2)
result
以上是我的代码,其中倒数几行的while被我注释掉了,如果使用while而不是后面的m2<-freItem(data,m2,2,0)
m2<-freItem(data,m2,2,1),就会出现Error in 1:nrow(m2) : argument of length 0 不使用while用手动的就正常运行。有大神可以帮忙看下是哪里错误吗?