Powtarzalny przykład kodu próbuję wektoryzacji.Wektoryzacja pętli for zawierającej instrukcję i funkcję
W szczególności chciałbym się dowiedzieć, czy istnieje sposób na wektorowanie tej części.
nrow(iris[ which(iris$Sepal.Length > cutOffs[plotPoint] &
iris$Sepal.Width > cutOffs[plotPoint]), ])
Powiedzmy, że było użyć biblioteki plyr lub jakąś formę zastosowania, nie ma prawdopodobnie znacznie przyspieszyć, co jest naprawdę czego szukam. Zasadniczo próbuję sprawdzić, czy istnieje technika wektoryzacji, którą przeoczyłem lub której nie udało mi się przeszukać.
UPDATE:
Unit: milliseconds
expr min lq mean median uq max neval
op() 33663.39700 33663.39700 33663.39700 33663.39700 33663.39700 33663.39700 1
jr() 3976.53088 3976.53088 3976.53088 3976.53088 3976.53088 3976.53088 1
dd() 4253.21050 4253.21050 4253.21050 4253.21050 4253.21050 4253.21050 1
exp() 5085.45331 5085.45331 5085.45331 5085.45331 5085.45331 5085.45331 1
nic() 8719.82043 8719.82043 8719.82043 8719.82043 8719.82043 8719.82043 1
sg() 16.66177 16.66177 16.66177 16.66177 16.66177 16.66177 1
Bardziej realistyczne zbliżanie co ja rzeczywiście robi to za
# generate data
numObs <- 1e5
iris <- data.frame(Sepal.Length = sample(1:numObs), Sepal.Width = sample(1:numObs))
cutOffs <- 1:(numObs*0.01)
plotOutput <- matrix(nrow=length(cutOffs), ncol=2)
colnames(plotOutput) <- c("x","y")
plotOutput[,"y"] <- cutOffs
a następnie w zależności od tego szczególna metoda kto woli.
Ogólnie rzecz biorąc, będzie używany na zestawy danych z 50 000 - 200 000 punktów.
Był duży skok z użyciem
sum(Sepal.Length > cutOffs[plotPoint] & Sepal.Width > cutOffs[plotPoint])
co jest, co mi brakuje jako bardziej optymalnego podejścia w pierwszej kolejności.
Zdecydowanie najlepszą odpowiedzią jest sg (sgibb). Kluczem jest to, że liczy się tylko najniższa z dwóch wartości w każdym rzędzie. Po dokonaniu tego mentalnego przeskoku istnieje tylko jeden wektor do rozwiązania i wektoryzacja jest dość prosta.
# cutOff should be lower than the lowest of Sepal.Length & Sepal.Width
m <- pmin(iris$Sepal.Length, iris$Sepal.Width)
Bardzo dobrze z 'findInterval' (+1). To był również mój punkt wyjścia, ale nie udało mi się to zepsuć i skończyłem z bardziej zawiłym kodem "cut". – Henrik