如何使用R计算项目集的频率?
我的输入文件每行包含一个事务。以下示例显示了我的输入文件的结构:如何使用R计算项目集的频率?,r,R,我的输入文件每行包含一个事务。以下示例显示了我的输入文件的结构: a a a,b b a,b a,c c c 上述输入文件有11个项目和8个项目集。此输入文件有3个唯一项和5个唯一项集。我想计算每个唯一项集的频率。对于上面的输入文件,我想编写一个R脚本,生成类似于以下CSV文件的输出: "a",0.25 "a,b",0.25 "c",0.25 "b",0.125 "a,c",0.125 报告显示输入事务文件中每个唯一项集的出现次数除以输入事务文件中项集的总数。请注意,报告已根据项目集的频率对
a
a
a,b
b
a,b
a,c
c
c
上述输入文件有11个项目和8个项目集。此输入文件有3个唯一项和5个唯一项集。我想计算每个唯一项集的频率。对于上面的输入文件,我想编写一个R脚本,生成类似于以下CSV文件的输出:
"a",0.25
"a,b",0.25
"c",0.25
"b",0.125
"a,c",0.125
报告显示输入事务文件中每个唯一项集的出现次数除以输入事务文件中项集的总数。请注意,报告已根据项目集的频率对其进行排序。如何使用R计算输入事务文件中项目集的频率
更新:我已经使用和方法计算了关联规则。我是否可以重用这些方法的结果来计算输入项集的频率。如果输入数据位于名为“dat.txt”的文件中,则此代码可以工作。输出将位于同一目录中名为“out.csv”的文件中
Y=read.table('dat.txt')
Y=as.character(unlist(Y))
U=unique(Y)
n=length(U)
F=rep(0,n)
for(i in 1:n) F[i] = mean(Y==U[i])
D=cbind(U,F)
colnames(D)=c("Value","Frequency")
write.csv(D,'out.csv')
很抱歉,这段代码既不美观也没有注释
dat另一种使用plyr的解决方案
dat <- read.table(text="a
a
a,b
b
a,b
a,c
c
c")
prop.table(table(dat$V1))
# a a,b a,c b c
#0.250 0.250 0.125 0.125 0.250
dat.prop <- as.data.frame( prop.table(table(dat$V1)) )
dat.prop <- dat.prop[order(dat.prop$Freq, decreasing=TRUE), ]
dat.prop
#-------- Added the order step as a revision
Var1 Freq
1 a 0.250
2 a,b 0.250
5 c 0.250
3 a,c 0.125
4 b 0.125
#---------
write.table(dat.prop, file="dat.prop.csv", sep=",", header=FALSE)
library(plyr)
ddply(dat, "V1", summarize, Freq = length(V1)/NROW(dat))
V1 Freq
1 a 0.250
2 a,b 0.250
3 a,c 0.125
4 b 0.125
5 c 0.250
就这么简单:
Data <- read.table(header=TRUE, text="
itemset
a
a
a,b
b
a,b
a,c
c
c")
cbind(table(Data), table(Data) / nrow(Data))
## EDIT: Include sorting by observed proportion
T <- table(Data) # observed freq.
T <- cbind(T, T/nrow(Data)) # combine freq. and prop.
T <- T[order(T[,2], decreasing=TRUE),] # sort
colnames(T) <- c("freq", "prop") # add column names
Data我认为这个方法最简单、最直接,不需要prop.table()。table()工作正常。请看下面我的答案。您需要除以数据帧的NROW
,或者使用prop.table
。我选择提供prop.table
,因为它可以推广到更高的维度。虽然这个小问题无关紧要,prop.table
效率很低:当data.frame
对象中已有nrow
时,它会计算x/sum(x)
。您看过代码了吗?它基本上是x/sum(x),所以我们真的没有争论什么。按频率排序很容易解决。请您更新代码,按频率递减排序好吗?@reprogrammer,我道歉。更新。有人能帮我吗,为什么我在尝试执行第一行代码时出现错误?read.table(header=TRUE,text=“\nitemset\na\na\na,b\nb\na,b\na,c\nc\nc”):未使用的参数(text=“\nitemset\na\na\na,b\nb\na,b\na,c\nc”)@moldovan您是否试图在一行中输入数据?@JasonMorgan Well。。我只是复制/粘贴,我想它会有用的。但这给了我一个错误未使用的参数(text=“\nitemset\na\na\na,b\nb\na,b\na,c\nc”)@moldovan我的意思是,您是像示例中那样以多行输入数据,还是像复制粘贴到上述注释中那样以单行输入数据?尝试手动输入数据,与上面完全相同。