我有一个包含月份,客户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)中尝试了稀疏矩阵方法,但由于某些我无法理解的原因,返回的数字不匹配。
任何想法都将不胜感激!
答案 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)
crossTable(tr, sort=TRUE)
# A B C
#A 4 2 2
#B 2 4 2
#C 2 2 4