假设我有一个值向量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)”一样?
答案 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)
答案 3 :(得分:0)
我建议你使用 table 和 as.vector:
as.vector(table(dataInVector))