Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中求向量中元素频率向量的最简单方法_R - Fatal编程技术网

R中求向量中元素频率向量的最简单方法

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值向量。得到长度等于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)”?

类似的方法对我很有效:

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))