【问题标题】:Find the n most common values in a vector [duplicate]查找向量中最常见的 n 个值
【发布时间】:2013-06-26 19:32:08
【问题描述】:

我有一个向量说

c(1,1,1,1,1,1,2,3,4,5,7,7,5,7,7,7)

我如何计算每个元素,然后返回例如3个最常见的元素,即1、7、5?

【问题讨论】:

标签: r count ranking


【解决方案1】:

如果你的向量只包含整数,tabulate 将比其他任何东西都快很多。有几个问题需要注意:

  • 默认情况下,它会返回从 1 到 N 的数字计数。
  • 它将返回一个未命名的向量。

这意味着,如果您的x = c(1,1,1,3) 然后tabulate(x) 将返回(3, 0, 1)。请注意,默认情况下计数为1 to max(x)

如何使用tabulate 确保可以传递任何数字?

set.seed(45)
x <- sample(-5:5, 25, TRUE)
#  [1]  1 -2 -3 -1 -2 -2 -3  1 -3 -5 -1  4 -2  0 -1 -1  5 -4 -1 -3 -4 -2  1  2  4

只要在min(x) &lt;= 0的时候加上abs(min(x))+1,确保值从1开始。如果是min(x) &gt; 0,那么直接使用tabulate即可。

sort(setNames(tabulate(x + ifelse(min(x) <= 0, abs(min(x))+1, 0)), 
      seq(min(x), max(x))), decreasing=TRUE)[1:3]

如果您的向量确实包含NA,那么您可以将tableuseNA="always" 参数一起使用。

【讨论】:

    【解决方案2】:

    您可以使用 table() 函数获取数组/向量中值频率的列表,然后对该表进行排序。

    x = c(1, 1, 1, 2, 2)
    sort(table(x))
    2 1
    2 3
    

    【讨论】:

      【解决方案3】:

      我不知道这是否比表格方法更好,但如果您的列表已经是一个因素,那么它的汇总方法将为您提供频率计数:

      > summary(as.factor(c(1,1,1,1,1,1,2,3,4,5,7,7,5,7,7,7)))
      1 2 3 4 5 7 
      6 1 1 1 2 5 
      

      然后您可以像这样获得最频繁的前 3 个:

      > names(sort(summary(as.factor(c(1,1,1,1,1,1,2,3,4,5,7,7,5,7,7,7))), decreasing=T)[1:3])
      [1] "1" "7" "5"
      

      【讨论】:

        【解决方案4】:

        我确定这是重复的,但答案很简单:

        sort(table(variable),decreasing=TRUE)[1:3]
        

        【讨论】:

        • 如果您要检查 NA 是否是最常见的值,请使用 table(variable, useNA = "ifany")。否则NAs 将被丢弃!
        • @DavidT:这是不正确的
        猜你喜欢
        • 1970-01-01
        • 2019-01-18
        • 2017-02-06
        • 1970-01-01
        • 1970-01-01
        • 2012-08-27
        • 1970-01-01
        • 2015-06-20
        相关资源
        最近更新 更多