2013-06-28 29 views
25

我有一个矢量说查找在载体的最常见的元素中的R

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

如何找到每个元素的计数并返回3个最经常存在的元素,即,1,7,5?

我认为这应该很简单,但我遇到了麻烦。

+1

你可以使用table()..参见http://stackoverflow.com/questions/1923273/counting-the-number-of-elements-with-the-values-of-x-in-a-vector – cobie

回答

53

我敢肯定,这是一个重复,但答案很简单:

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

如果你正在检查“NA”是否是最常用的值,则使用'table(variable,useNA =“ifany”)。否则'NA's会掉线! – alexpghayes

2

你可以使用表()函数来得到一个数组/矢量值的频率的列表,然后排序这张桌子。

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

我不知道这是不是表的方式更好,但如果你的名单已经是一个因素则及其摘要方法会给你的频数:

> 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" 
7

如果向量仅包含整数,tabulate速度比 还要别的吗。有一对夫妇渔获物要注意的:

  • 它会默认从1返回编号的个数为N.
  • 它会返回一个不愿透露姓名的载体。

这意味着,如果您的x = c(1,1,1,3)然后将返回(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))+1min(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,那么你可以使用tableuseNA="always"参数。