2016-10-10 53 views
1

我有边缘形式的事务数据,并且需要创建基于事务的稀疏矩阵,该矩阵可以与arules R包一起使用。目前我正在使用tidyr软件包中的“spread”将边缘列表转换为矩阵,并将每行转换为“basket ID”,然后将其转换为逻辑,因为我无法将数量信息与arules一起使用,所以将其转换为“交易“为基础的数据类型,请参阅下面的R代码示例:将边缘列表转换为arules事务稀疏邻接矩阵

我的问题是,这适用于小集篮子/交易,但是当我有更多时,由于”传播“功能导致内存问题。我想知道是否有与原边视图到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 
+0

是'table'还好吗? '表(TransEdgeList [1:2])'或'xtabs(〜BasketID + Item,data = TransEdgeList,sparse = TRUE)' – user20650

回答

2

我会手工创建一个稀布L ogical triplet矩阵(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 
+0

谢谢迈克尔!这只是我需要的。 – Kevin

+0

另一种方法是使用'?'的例子。交易“:a_df3 < - data.frame( TID = c(1,1,2,2,2,3), item = c(”a“,”b“,”a“,”b“, “c”,“b”) ); trans4 < - as(split(a_df3 [,“item”],a_df3 [,“TID”]),“transactions”)'。我认为应该有类似的表现。 –