制表关联频率计数

Posted

技术标签:

【中文标题】制表关联频率计数【英文标题】:Tabulating association frequency counts 【发布时间】:2014-07-13 06:11:44 【问题描述】:

我有这种格式的数据:

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

【问题讨论】:

您的示例代码中没有定义 x,因此您在尝试计算 combn(x,2) 时遇到错误也就不足为奇了! 【参考方案1】:

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 包括空组合)。

【讨论】:

所以我尝试了您的示例,它完美地适用于您的数据。我尝试使用我的示例,并收到更新中列出的错误。它说组合错误。我不知道为什么,而且我在 R 方面的经验并不丰富,无法真正理解是什么原因造成的。 好的,所以我通过首先删除只有 1 个项目的用户解决了这个问题(反正对这些都不感兴趣)。如果我希望您的结果作为 3 列数据框,我可以要求跟进吗? IE。学期1,学期2,计数【参考方案2】:

经过 Glen 的一些研究和建议,我想出了以下代码,它为我提供了一个 3 列的 CSV 文件,其中包含对组合和频率计数。如果有人看到更好的方法,请告诉我!但这似乎行得通。

我在后续 cmets 中提到的错误是由用户仅在一个位置购买造成的。

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")

编辑-我做了一个小改动,通过按键对数据表进行排序,使其顺序独立。

【讨论】:

以上是关于制表关联频率计数的主要内容,如果未能解决你的问题,请参考以下文章

频率计和通用计数器的区别?

如何在 R 中获取表格,包括计数、相对频率和累积频率?

SYN5637型高精度频率计数器

字符串的计数频率

频率计数日期

python csv文件频率计数