【问题标题】:Calculate frequency of occurrence in an array using R使用 R 计算数组中出现的频率
【发布时间】:2014-11-06 06:45:00
【问题描述】:

我有一个数组

a <- c(1,1,1,1,1,2,3,4,5,5,5,5,5,6,7,7,7,7)

我想使用一些命令来告诉我数组中哪个是最常见的数字?

有一个简单的命令吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    table() 函数就足够了,如果您的数据有多个模式,则特别有用。

    考虑以下选项,它们都与table()max() 相关。


    # Your vector
    a = c(1,1,1,1,1,2,3,4,5,5,5,5,5,6,7,7,7,7)
    
    # Basic frequency table
    table(a)
    # a
    # 1 2 3 4 5 6 7 
    # 5 1 1 1 5 1 4 
    
    # Only gives me the value for highest frequency
    # Doesn't tell me which number that is though
    max(table(a))
    # [1] 5
    
    # Gives me a logical vector, which might be useful
    # but not what you're asking for in this question
    table(a) == max(table(a))
    # a
    #    1     2     3     4     5     6     7 
    # TRUE FALSE FALSE FALSE  TRUE FALSE FALSE 
    
    # This is probably more like what you're looking for
    which(table(a) == max(table(a)))
    # 1 5 
    # 1 5 
    
    # Or, maybe this
    names(which(table(a) == max(table(a))))
    # [1] "1" "5"
    

    如 cmets 所示,在某些情况下,您可能希望查看两个或三个最常出现的值,在这种情况下,sort() 很有用:

    sort(table(a))
    # a
    # 2 3 4 6 7 1 5 
    # 1 1 1 1 4 5 5 
    

    您还可以设置要在表中返回的值的阈值。例如,如果您只想返回那些出现多次的数字:

    sort(table(a)[table(a) > 1])
    # a
    # 7 1 5 
    # 4 5 5 
    

    【讨论】:

    • which.max 函数可以稍微简化一下上面的内容(但这里给出的长版本很容易理解)。
    • @GregSnow,这是扩展版本背后的基本思想。至于which.max 的使用,那不是只返回first 匹配值。也就是说,如果有人使用names(which.max(table(a))),我认为(现在无法检查)他们只会得到"1" 作为答案。还是您有其他想法可以编辑到上面的答案中?
    • 你是对的,which.max 只返回第一个匹配项。超过 1 个值等于最大值的机会随着可能值的数量和向量的大小而降低,因此在某些情况下它仍然是合理的,但您的解决方案是更通用的解决方案。我更喜欢查看整个表格(就像您开始时一样),因为如果最大值为 100 并且还有另一个值为 99 的值,那么这仍然非常有趣,但自动“模式”程序不会显示这一点。
    • @GregSnow,感谢您的 cmets,以及有时对可能在频率上接近模式的其他值感兴趣的好点。我编辑了我的答案以包含使用sort(table(a)) 的建议,以便将最常出现的值“聚集”在一起。在这些类型的分析(当然,使用更大的数据集)中,我的一般建议是首先绘制条形图、茎叶图、直方图或密度图,以便在跳转到不同的数据分布之前获得数据分布的“概览”集中趋势的度量。
    【解决方案2】:

    使用table()函数:

    ## Your vector:
    a <- c(1,1,1,1,1,2,3,4,5,5,5,5,5,6,7,7,7,7)
    
    ## Frequency table
    > counts <- table(a)
    
    ## The most frequent and its value
    > counts[which.max(counts)]
    # 1
    # 5
    
    ## Or simply the most frequent
    > names(counts)[which.max(counts)]
    # [1] "1"
    

    【讨论】:

      【解决方案3】:

      我编写了一些个人代码来查找模式和更多内容(几年前。正如 Ananda 所展示的,这是非常明显的东西):

      smode<-function(x){
          xtab<-table(x)
          modes<-xtab[max(xtab)==xtab]
          mag<-as.numeric(modes[1]) #in case mult. modes, this is safer
          #themodes<-names(modes)
          themodes<-as.numeric(names(modes))
          mout<-list(themodes=themodes,modeval=mag)
          return(mout)
          }
      

      Blah blah 版权所有 blah blah 随心所欲地使用,但不要从中赚钱。

      【讨论】:

      • 当有 no 模式时,你不应该包括一些错误检查吗? (并不是说我也不应该回答。)另外,您关于版权等的最后陈述如何与“cc-wiki”许可证一起使用。 +1 用于整齐地展示输出。
      • 总有一种模式,病态地,因为在 table 对象中总是有一个最大值。当然,只要输入:-),返回列表并没有多大用处。我只是在开玩笑说版权——以为“废话”就泄露了。
      【解决方案4】:

      您想要的是数据的模式:计算它有多种不同的选项。 modeest 包有一组用于模态估计的函数,但对于你想要的可能有点矫枉过正。

      另见:

      Is there a built-in function for finding the mode?

      How to compute conditional Mode in R?

      希望有帮助

      【讨论】:

      • 它返回消息“数字”
      • 对不起,误解了这个功能:@Ananda 看起来是一个可行的解决方案。我已经为同一个问题添加了一些指向其他 Stack Overflow 线程的链接。
      猜你喜欢
      • 2019-07-08
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      • 1970-01-01
      相关资源
      最近更新 更多