2013-08-30 56 views
0

我有一个数组:提高速度

myarray<-array(rep(1:5,3*99), dim=c(9,3,99)) 

和的函数:

freq<-function(x){ 
    m<-names(which(table(x) == max(table(x)))); m<-as.numeric(m) 
if (length(m)>1){ m<-sample(m,1) } else m 
} 

我想看看在每个矩阵的阵列中,即myArray的第二列[ ,2,]并确定该列中最频繁的值。如果有2个或更多的频繁值,我想随机选择一个。要做到这一点,我写了上述功能,并将其应用到阵列使用:

apply(myarray[,2,],2,freq) 

这很好,但执行时间有点慢。

我相信它很慢,因为函数生成一个表并转换数据结构。 有没有更高效的方法?

在做了一些阅读之后,我发现tabulate()是获取向量中出现频率的最快方法。

我有这么远:

f<-function(x){ 
    a<-which.max(tabulate(x)) 
if (length(a)>1) {a<-sample(a,1)} else {a} 
} 

which.max部分不工作,因为它总是返回的第一个值。一旦我从列表中得到结果,我如何才能列出最频繁发生的数字?

回答

0

您可以使用nnet::which.is.max,它随机打破关系而不是取第一个值。

+0

但这不会选择最频繁的元素。这很容易验证:a <-c(1,1:10); nnet :: which.is.max(a)每次返回不同的值,尽管它应该返回1。 – ghb