【发布时间】: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?
【问题讨论】:
-
你可以使用 table().. 见stackoverflow.com/questions/1923273/…
我有一个向量说
c(1,1,1,1,1,1,2,3,4,5,7,7,5,7,7,7)
我如何计算每个元素,然后返回例如3个最常见的元素,即1、7、5?
【问题讨论】:
如果你的向量只包含整数,tabulate 将比其他任何东西都快很多。有几个问题需要注意:
这意味着,如果您的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) <= 0的时候加上abs(min(x))+1,确保值从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,那么您可以将table 与useNA="always" 参数一起使用。
【讨论】:
您可以使用 table() 函数获取数组/向量中值频率的列表,然后对该表进行排序。
x = c(1, 1, 1, 2, 2)
sort(table(x))
2 1
2 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"
【讨论】:
我确定这是重复的,但答案很简单:
sort(table(variable),decreasing=TRUE)[1:3]
【讨论】:
NA 是否是最常见的值,请使用 table(variable, useNA = "ifany")。否则NAs 将被丢弃!