Попробуйте вместо этого:
which( apply(data, 2, function(x) all.equal(c(1:4),x)) == TRUE)
Разница в том, что в вашем коде вы сравниваете всю структуру, называемую data
, с 1: 4, которая никогда не будет TRUE
, так как размеры don ' т совпадают. Я заменил data
на x
внутри применяемой функции, поэтому теперь каждый отдельный столбец сравнивается с 1: 4.
В вашем коде также есть некоторые избыточности, c(1:4)
- это такой же как 1:4
. И all.equal
, вероятно, излишне в этом случае, поскольку он делает больше, чем просто сравнение (он сравнивается с коэффициентом размытости и говорит вам, как все обстоит иначе). То, как вы используете его, вы конвертируете TRUE
в символ. Было бы эффективнее не упрощать заранее. Вот быстрое сравнение (меньшие смоделированные данные):
> library(microbenchmark)
>
> microbenchmark(
+ ae = {
+ data<-replicate(100,sample(4))
+ which( apply(data, 2, function(x) all.equal(c(1:4),x)) == TRUE)
+ },
+ e = {
+ data <- replicate(100, sample(4), simplify=FALSE)
+ which(sapply(data, function(x)all(x==(1:4))))
+ }
+ )
Unit: microseconds
expr min lq mean median uq max neval cld
ae 4063.205 4303.3370 4940.2126 4501.5080 4951.623 10953.339 100 b
e 455.934 493.3115 578.4828 523.4605 562.601 2013.444 100 a
Упрощенный код выполняется примерно в одну девятую (в среднем) времени.