【问题标题】:Convert edge list to a arules transaction sparse adjacency matrix将边列表转换为 arules 事务稀疏邻接矩阵
【发布时间】:2016-10-10 18:25:41
【问题描述】:

我有边缘形式的交易数据,我需要创建一个可与 arules R 包一起使用的基于交易的稀疏矩阵。目前我正在使用 tidyr 包中的“spread”将边缘列表转换为矩阵,每行作为“篮子 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

【问题讨论】:

  • table 更好吗? table(TransEdgeList[1:2])xtabs(~ BasketID + Item, data=TransEdgeList, sparse=TRUE)

标签: r transactions arules


【解决方案1】:

我会手动构建一个稀疏逻辑三元组矩阵 (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   

【讨论】:

  • 谢谢迈克尔!这只是我需要的。
  • 另一种方法是使用来自? transactions 的示例:a_df3 &lt;- data.frame( TID = c(1,1,2,2,2,3), item=c("a","b","a","b","c", "b") ); trans4 &lt;- as(split(a_df3[,"item"], a_df3[,"TID"]), "transactions")。我认为应该有类似的表现。
猜你喜欢
  • 2016-07-19
  • 2016-12-05
  • 2021-07-02
  • 1970-01-01
  • 2023-04-10
  • 2021-11-25
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多