【问题标题】:How can I compute the frequencies of itemsets using R?如何使用 R 计算项集的频率?
【发布时间】:2012-01-07 05:42:47
【问题描述】:

我的输入文件的每一行都包含一个事务。以下示例显示了我的输入文件的结构:

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 计算输入事务文件中项集的频率?

更新:我已经使用read.transactionsapriori 方法计算了关联规则。我可以重复使用这些方法的结果来计算输入项集的频率吗?

【问题讨论】:

    标签: r


    【解决方案1】:
    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)
    

    【讨论】:

    • 我觉得这个方法是最简单最直接的。
    • 不需要prop.table()。 table() 工作正常。请参阅下面的答案。
    • 好吧,你要么需要除以数据框的NROW,要么使用prop.table。我选择提供prop.table,因为它可以推广到更高的维度
    • 是的。虽然对于这个小问题并不重要,但prop.table 的效率相当低:当nrow 已经从data.frame 对象中可用时,它会计算x/sum(x)
    • 你看过代码了吗?基本上就是 x/sum(x),所以我们真的是无理取闹。
    【解决方案2】:

    就这么简单:

    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
    

    【讨论】:

    • @reprogrammer 我很抱歉。已更新。
    • 谁能帮帮我,为什么我在尝试执行第一行代码时出现错误? read.table 中的错误(标题 = TRUE,文本 = "\nitemset\na\na\na,b\nb\na,b\na,c\nc\nc"):未使用的参数(文本 = "\集合\na\na\na,b\nb\na,b\na,c\nc\nc")
    • @moldovean 您是否尝试在单行中输入数据?
    • @JasonMorgan 好吧.. 我只是复制/粘贴,我认为它会工作。但这给了我一个错误。 : 未使用的参数 (text = " \nitemset \na \na \na, b\nb \na, b\na, c\nc")
    • @moldovean 我的意思是你是在多行中输入数据,如示例中,还是单行,如复制粘贴到上述 cmets?尝试手动输入数据,就像上面一样。
    【解决方案3】:

    如果输入数据位于名为“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')
    

    我很抱歉这段代码既不漂亮也不评论。

    【讨论】:

      【解决方案4】:

      使用plyr的另一种解决方案

      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
      

      【讨论】:

      • 通过频率排序很容易修复。
      • 您能否更新您的代码以按频率降序排序?
      猜你喜欢
      • 2017-05-12
      • 2016-10-30
      • 2012-06-03
      • 2022-10-04
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      相关资源
      最近更新 更多