提高代码执行速度

时间:2013-08-30 18:27:27

标签: arrays r

我有一个数组:

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部分不起作用,因为它总是返回第一个值。一旦我从表格中得到结果,我怎样才能列出最常出现的数字?

1 个答案:

答案 0 :(得分:0)

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