我的数据格式为:
User Item
1 A
1 B
1 C
1 D
2 A
2 C
2 E
我想得到的是每对的频率计数。订单并不重要,所以我不想计算倒数。我希望最终得到与此类似的结果,其中频率计数由用户划分。
Pair Frequency
AB 1
AC 2
AD 1
AE 1
BC 1
BD 1
BE 0
CD 1
CE 1
我可以使用什么工具来制定这种表格?如果可能,我更喜欢一些开源解决方案。
编辑 - 我在下面的评论添加了示例
我使用以下两行从CSV文件中读取数据,并在代码中删除这两个步骤的因素。
xa<-read.csv("C:/Direcotry/MyData.csv")
xa<-data.frame(lapply(xa, as.character), stringsAsFactors=FALSE)
User Item
1 394324 Item A
2 124209 Item B
3 212457 Item C
4 427052 Item A
5 118281 Item D
6 156831 Item A
7 212442 Item E
8 156831 Item B
9 212442 Item A
10 177734 Item C
当我尝试运行建议的答案时,我得到一个错误:
Error in combn(x, 2) : n < m
答案 0 :(得分:4)
R井是开源的。
以下是基于您的微小数据样本的示例:
在这里,我只是通过直接从您的帖子中复制数据来阅读您的数据:
> xa=read.table(stdin(),header=TRUE,as.is=TRUE)
0: User Item
1: 1 A
2: 1 B
3: 1 C
4: 1 D
5: 2 A
6: 2 C
7: 2 E
8:
这样就是数据。然后用几行代码:
> f=function(x) apply(combn(x,2),2,paste0,collapse="")
> table(unlist(tapply(xa$Item,xa$User,f)))
AB AC AD AE BC BD CD CE
1 2 1 1 1 1 1 1
如果您需要将所有空组合显式为零,则需要另外一行或两行(您需要生成所有可能的组合作为因子,而不仅仅是观察到的组合,并告诉table
包含空的组合)。
答案 1 :(得分:0)
在Glen的一些研究和建议之后,我想出了以下代码,它为我提供了一个3列CSV文件,其中包含对组合和频率计数。如果有人看到更好的方式,请告诉我!但这似乎有效。
我在后续评论中提到的错误是由于用户只在一个地方购买的。
library(reshape2)
xa<-read.csv("C:/Input.csv",as.is=TRUE)
xa=xa[!duplicated(xa),]
xa<-data.table(xa)
setkey(xa,ContactId,PurchaseLocation)
tab=table(xa$ContactId)
xa=xa[xa$ContactId %in% names(tab[tab>1]),]
f=function(x) apply(combn(x,2),2,paste0,collapse="--")
xb<-as.data.frame(table(unlist(tapply(xa$PurchaseLocation,xa$ContactId,f))))
xc=with(xb, cbind(Freq, colsplit(xb$Var1, pattern = "--", names = c('a', 'b'))))
xc=subset(xc,a!=b & a!="" & b!="" & Freq>1)
write.csv(xc,file="C:/Output.csv")
编辑 - 我做了一个小改动,通过在键上对数据表进行排序来使其与订单无关。