假设我有一个值向量 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)”的思路,肯定有一种更简单的方法可以做到这一点?
最佳答案
对于小正整数向量 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()[]
有效获取频率的技巧,然后对结果进行排序,使输出与输入匹配,逐个组件。
关于r - R中获取向量中元素频率向量的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30353392/