查找大型数据集中的值的共现

时间:2017-02-18 00:57:08

标签: r sparse-matrix

我有一个包含月份,客户ID和商店ID的大型数据集。每个客户,每个位置,每月有一条记录,总结了他们在该位置的活动。

  Month  Customer ID Store
  Jan       1      A
  Jan       4      A
  Jan       2      A
  Jan       3      A    
  Feb       7      B
  Feb       2      B
  Feb       1      B
  Feb       12     B
  Mar       1      C
  Mar       11     C 
  Mar       3      C
  Mar       12     C

我有兴趣创建一个矩阵,显示每个位置与另一个位置共享的客户数量。像这样:

      A        B         C
A     4        2         2     
B     2        4         2
C     2        2         4

例如,由于客户在下个月访问了商店A然后访问了商店B,因此他们将被添加到计数器中。我对共享客户的数量感兴趣,而不是访问次数。

我在这个线程(Creating co-occurrence matrix)中尝试了稀疏矩阵方法,但由于某些我无法理解的原因,返回的数字不匹配。

任何想法都将不胜感激!

2 个答案:

答案 0 :(得分:3)

更新: 我发布的原始解决方案适用于您的数据。但是你的数据有 这个不寻常的财产,没有客户曾经访问过两个不同的同一家商店 个月。假设会发生这种情况,需要进行修改。

我们需要的是客户的商店矩阵,如果客户有,则为1 访问了商店,否则为零。使用的原始解决方案 M = as.matrix(table(Dat$ID_Store, Dat$Customer))
这给出了每个客户访问商店的不同月份。同 不同的数据,这些数字可能不止一个。我们可以通过使用来解决这个问题 M = as.matrix(table(Dat$ID_Store, Dat$Customer) > 0)
如果你看一下这个矩阵,它会说TRUE和FALSE,但是因为TRUE = 1而FALSE = 0 这将工作得很好。所以完整的纠正解决方案是:

M = as.matrix(table(Dat$ID_Store, Dat$Customer) > 0)
M %*% t(M)

    A B C
  A 4 2 2
  B 2 4 2
  C 2 2 4

答案 1 :(得分:1)

我们也可以试试这个:

library(reshape2)
df <- dcast(df,CustomerID~Store, length, value.var='Store')
#  CustomerID A B C
#1          1 1 1 1 
#2          2 1 1 0 # Customer 2 went to stores A,B but not to C
#3          3 1 0 1
#4          4 1 0 0
#5          7 0 1 0
#6         11 0 0 1
#7         12 0 1 1
crossprod(as.matrix(df[-1]))
#  A B C
#A 4 2 2
#B 2 4 2
#C 2 2 4

使用库arules

library(arules)
write('   Jan       1      A
          Jan       4      A
          Jan       2      A
          Jan       3      A    
          Feb       7      B
          Feb       2      B
          Feb       1      B
          Feb       12     B
          Mar       1      C
          Mar       11     C 
          Mar       3      C
          Mar       12     C', 'basket_single')
tr <- read.transactions("basket_single", format = "single", cols = c(2,3))
inspect(tr)
#    items   transactionID
#[1] {A,B,C} 1            
#[2] {C}     11           
#[3] {B,C}   12           
#[4] {A,B}   2            
#[5] {A,C}   3            
#[6] {A}     4            
#[7] {B}     7    
image(tr)

enter image description here

crossTable(tr, sort=TRUE)
#  A B C
#A 4 2 2
#B 2 4 2
#C 2 2 4