60

我有一个向量说

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

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

4

4 回答 4

102

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

sort(table(variable),decreasing=TRUE)[1:3]
于 2013-06-28T22:38:10.813 回答
14

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

> 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"
于 2013-06-28T22:47:46.883 回答
9

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

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

这意味着,如果您的x = c(1,1,1,3)thentabulate(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

只需添加abs(min(x))+1whenmin(x) <= 0以确保值从 1 开始。如果min(x) > 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,那么您可以使用tablewithuseNA="always"参数。

于 2013-06-28T22:51:07.733 回答
2

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

x = c(1, 1, 1, 2, 2)
sort(table(x))
2 1
2 3
于 2013-06-28T22:39:25.207 回答