在R中最简单的方法来获得向量中元素频率的向量

时间:2015-05-20 14:12:53

标签: r

假设我有一个值向量v。获得长度等于v的向量f的最简单方法是什么,其中f的第i个元素是v中v的第i个元素的频率?

我知道这样做的唯一方法似乎不必要地复杂化:

v = sample(1:10,100,replace=TRUE)
D = data.frame( idx=1:length(v), v=v )
E = merge( D, data.frame(table(v)) )
E = E[ with(E,order(idx)), ]
f = E$Freq

当然,有一种更简单的方法可以做到这一点,就像“频率(v)”一样?

4 个答案:

答案 0 :(得分:2)

对于小正整数v的向量,如问题中的表达式

tabulate(v)[v]

特别简单,也很快。

对于更一般的数字向量v,您可以说服ecdf帮助您,例如

w <- sapply(v, ecdf(v)) * length(v)
tabulate(w)[w]

最好自己编写基础算法,但这肯定会避免前面解决方案中隐含的浮点舍入错误:

frequencies <- function(x) {
  i <- order(x)
  v <- x[i]
  w <- cumsum(c(TRUE, v[-1] != v[-length(x)]))
  f <- tabulate(w)[w]
  return(f[order(i)])
}

该算法对数据进行排序,在遇到它们时为它们分配顺序标识符1,2,3 ......(通过对值变化时的二进制指示符求和),使用前面的tabulate()[]技巧要有效地获得频率,然后对结果进行排序,使输出逐个组件地与输入匹配。

答案 1 :(得分:1)

这样的事情对我有用:

sapply(v, function(elmt, vec) sum(vec == elmt), vec=v)

答案 2 :(得分:1)

我认为这里最好的解决方案是:

ave(v,v,FUN=length)

简单ave()的设计是复制并将FUN()的返回值映射回输入向量的每个索引,其输入向量的元素是{{{ 1}}被执行了。

答案 3 :(得分:0)

我建议你使用 table 和 as.vector:

as.vector(table(dataInVector))