R中求向量中元素频率向量的最简单方法
假设我有一个v值向量。得到长度等于v的向量f的最简单方法是什么,其中f的第i个元素是v中v的第i个元素的频率 我知道的唯一方法似乎不必要地复杂:R中求向量中元素频率向量的最简单方法,r,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
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)”?类似的方法对我很有效:
sapply(v, function(elmt, vec) sum(vec == elmt), vec=v)
对于小正整数向量
v
,如问题中所述,表达式
tabulate(v)[v]
它特别简单而且快速
对于更一般的数值向量v
,您可以说服ecdf
帮助您,如
w <- sapply(v, ecdf(v)) * length(v)
tabulate(w)[w]
w我认为最好的解决方案是:
ave(v,v,FUN=length)
它的设计就是将FUN()
的返回值复制并映射回输入向量的每个索引,输入向量的元素是执行FUN()
特定调用的组的一部分。我建议您使用table和as.vector:
as.vector(table(dataInVector))
我认为您甚至不需要单独提供vec
。也就是说,简单地sapply(v,函数(x){sum(x==v)})
也适用于我。你是对的,我只是不喜欢函数中有全局变量;)你完全正确,这是更好的编码实践,我也这么认为:)我相信这种方法是最合适的。另外,在非整数v
中,您可以使用w=match(v,unique(v))
@alexis提供制表
,谢谢您的建议。它导致了一个清晰易懂的解决方案。虽然我还没有测试过它,但我怀疑使用match
和unique
可能会明显减慢速度。只测试顺序和部分频率(即前两行)与匹配:x=runif(1e5);microbenchmark::microbenchmark(x[order(x)],匹配(x,unique(x) ),次=30)
;match
似乎已经快了。@alexis非常有趣!我以后会更加关注match
。+1,因为我不知道ave
:谢谢!语法上很简单,也很清楚。不过,如果性能是个问题,那么ave
所花的时间大约是的两倍de>frequency
在我的答案中起作用(除了非常大的向量,长度大于100M左右,平均频率非常小:ave
在平均频率很小的情况下缩放得更好)。
as.vector(table(dataInVector))