将边列表转换为arules事务稀疏邻接矩阵

时间:2016-10-10 18:25:42

标签: r transactions arules

我有一个边缘形式的事务数据,我需要创建一个基于事务的稀疏矩阵,可以与arules R包一起使用。目前我正在使用" spread"从tidyr包中将边列表转换为矩阵,每行作为"篮子ID。然后我把它转换成逻辑,因为我不能使用数量信息和arules我转换它"事务"基于数据类型。请参阅下面的R代码示例。

我的问题是,这适用于小套装篮子/交易,但是当我有更多的篮子/交易时,它会导致内存问题,因为"传播"功能。我想知道是否有更多内存/资源有效的方法将原始边视图转换为arules使用的事务数据类型?提前感谢任何建议!

## Load libraries

library(tidyr)
library(arules)

## Create an example of the transactions that I am analizing 

TransEdgeList = data.frame(BasketID=c(1,1,2,2,3,3,3), 
                               Item=c(10,11,10,12,10,11,13),
                               Qty=c(1,1,2,3,1,2,1))

#convert to something that arules can transform
BasketDataFrame = spread(TransEdgeList, Item, Qty)

#convert to logical 
BasketDataFrame[, 2:dim(BasketDataFrame)[2]]=  
  !is.na(BasketDataFrame[, 2:dim(BasketDataFrame)[2]])

#convert to a transaction sparse matrix that arules can use
BasketMatrix = as(BasketDataFrame[, 2:dim(BasketDataFrame)[2]], "transactions")

BasketMatrix

1 个答案:

答案 0 :(得分:2)

我会手动构建稀疏逻辑三元组矩阵(ngTMatrix),将其转换为稀疏ngCMatrix,然后可以将其转换为事务对象。这种方式永远不会创建完整的矩阵表示,你应该记忆良好。

 library(arules)
 library(Matrix)

 TransEdgeList <- data.frame(BasketID=c(1,1,2,2,3,3,3), 
   Item=c(10,11,10,12,10,11,13),
   Qty=c(1,1,2,3,1,2,1))

 m <- new("ngTMatrix", 
   i = as.integer(TransEdgeList$Item)-1L, 
   j = as.integer(TransEdgeList$BasketID)-1L, 
    Dim = as.integer(c(max(TransEdgeList$Item), max(TransEdgeList$BasketID))))

 m <- as(m, "ngCMatrix")

 tr <- as(m, "transactions")
 inspect(tr)

     items      itemsetID
 [1] {10,11}    1        
 [2] {10,12}    2        
 [3] {10,11,13} 3