我想以篮子格式创建一个交易对象,我可以随时调用它进行分析。数据包含逗号分隔的项目,包含1001个事务。前10个交易看起来像这样:
hering,corned_b,olives,ham,turkey,bourbon,ice_crea
baguette,soda,hering,cracker,heineken,olives,corned_b
avocado,cracker,artichok,heineken,ham,turkey,sardines
olives,bourbon,coke,turkey,ice_crea,ham,peppers
hering,corned_b,apples,olives,steak,avocado,turkey
sardines,heineken,chicken,coke,ice_crea,peppers,ham
olives,bourbon,coke,turkey,ice_crea,heineken,apples
corned_b,peppers,bourbon,cracker,chicken,ice_crea,baguette
soda,olives,bourbon,cracker,heineken,peppers,baguette
corned_b,peppers,bourbon,cracker,chicken,bordeaux,hering
...
我发现数据中存在重复的事务并将其删除,但每次我尝试读取事务时,都会得到:
asMethod(object)出错: 不能用包含重复项目的交易强制列表
这是我的代码:
data <- read.csv("AssociationsItemList.txt",header=F)
data <- data[!duplicated(data),]
pop <- NULL
for(i in 1:length(data)){
pop <- paste(pop, data[i],sep="\n")
}
write(pop, file = "Trans", sep = ",")
transdata <- read.transactions("Trans", format = "basket", sep=",")
我确信我错过了一些重要的东西。请提供帮助。
答案 0 :(得分:16)
问题不在于重复的交易(同一行出现两次) 但重复的项目(同一项目出现两次,在同一笔交易中 - 例如,第4行的“橄榄”。
read.transactions
有一个rm.duplicates
参数来删除这些重复项。
read.transactions("Trans", format = "basket", sep=",", rm.duplicates=TRUE)
答案 1 :(得分:1)
Vincent Zoonekynd是对的,问题是由交易中的重复项引起的。在这里,我可以解释为什么arules
需要没有重复项目的交易。
transactions
的数据在内部存储为ngCMatrix
对象。相关源代码:
setClass("itemMatrix",
representation(
data = "ngCMatrix",
...
setClass("transactions",
contains = "itemMatrix",
...
ngCMatrix
是在Matrix
包中定义的稀疏矩阵。这是官方文件中的描述:
nsparseMatrix类是稀疏“模式”矩阵的虚拟类,即概念上具有TRUE / FALSE条目的二进制矩阵。仅存储TRUE元素的位置
二进制指标似乎ngCMatirx
存储了元素的状态。这意味着transactions
中的arules
对象只能为交易对象存储存在/不存在,并且无法记录数量。所以......
答案 2 :(得分:0)
我只是使用'unique'功能来删除重复项。我的数据有点不同,因为我有一个数据框(数据对于CSV而言太大)而且我有两列:product_id和transaction_id。我知道这不是您的具体问题,但我必须这样做才能创建交易数据集并应用关联规则。
data # > 1 Million Transactions
data <- unique(data[ , 1:2 ] )
trans <- as(split(data[,"product_id"], data[,"trans_id"]),"transactions")
rules <- apriori(trans, parameter = list(supp = 0.001, conf = 0.2))