8

我想创建一个篮子格式的交易对象,我可以随时调用它进行分析。数据包含 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=",")

我敢肯定,我错过了一些小而重要的事情。请提供您的帮助。

4

3 回答 3

18

问题不在于重复的事​​务(同一行出现两次),而是重复的项目(同一项目在同一事务中出现两次——例如,第 4 行的“olives”)。

read.transactions有一个rm.duplicates参数来删除这些重复项。

read.transactions("Trans", format = "basket", sep=",", rm.duplicates=TRUE)
于 2013-06-17T15:21:26.120 回答
2

Vincent Zoonekynd 是对的,问题是由交易中的重复项目引起的。在这里,我可以解释为什么arules需要没有重复项目的交易。

  • 的数据在transactions内部存储为ngCMatrix对象。相关源代码:

    setClass("itemMatrix",
      representation(
        data        = "ngCMatrix", 
    ...
    setClass("transactions",
      contains = "itemMatrix",
    ...
    
  • ngCMatrixMatrix是在包中定义的稀疏矩阵。来自官方文档的描述:

    nsparseMatrix 类是稀疏“模式”矩阵的虚拟类,即概念上具有 TRUE/FALSE 条目的二进制矩阵。仅存储 TRUE 元素的位置

似乎通过二进制指示器ngCMatirx存储了元素的状态。这意味着该对象只能存储交易对象的存在/不存在,不能记录数量。所以...transactionsarules

于 2017-02-03T13:08:15.803 回答
0

我只是使用“独特”功能来删除重复项。我的数据有点不同,因为我有一个数据框(数据对于 CSV 来说太大了)并且我有 2 列: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))
于 2017-07-07T17:48:52.073 回答