在R中找到向量中最常见的元素

Cha*_*eow 44 r

我有一个矢量说

c(1,1,1,1,1,1,2,3,4,5,7,7,5,7,7,7)
Run Code Online (Sandbox Code Playgroud)

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

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

Tho*_*mas 77

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

sort(table(variable),decreasing=TRUE)[1:3]
Run Code Online (Sandbox Code Playgroud)

  • 使用`table(变量,useNA ="ifany")`如果你正在检查`NA`是否是最常用的值.否则`NA'会掉线! (4认同)
  • @DavidT:那是不正确的 (4认同)

qww*_*wwq 9

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

> 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 
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样最频繁地获得前三名:

> 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"
Run Code Online (Sandbox Code Playgroud)


Aru*_*run 8

如果您的向量仅包含整数,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
Run Code Online (Sandbox Code Playgroud)

只需添加abs(min(x))+1时间min(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]
Run Code Online (Sandbox Code Playgroud)

如果您的载体确实包含NA,那么你可以使用table带有useNA="always"参数.