Вот три метода с их ориентирами. Вы можете видеть, что предварительное распределение вектора, как и в функции method2
, довольно быстро, а метод lapply - средний, а ваша функция является самой медленной.
Конечно, это 1D векторы, а не массивы n-D, но я ожидал, что эталонные тесты будут похожи или даже более выражены.
method1 <- function(line) {
data<-NULL
for(i in 1:length(line)){
data=append(data,line[i])
}
}
method2 <- function(line) {
data <- vector(mode="numeric", length = length(line))
for (i in 1:length(line)) {
data[i] <- line[i]
}
}
library(microbenchmark)
r <- rnorm(1000)
microbenchmark(method2(r), unit="ms")
#> Unit: milliseconds
#> expr min lq mean median uq max neval
#> method2(r) 2.18085 2.279676 2.428731 2.371593 2.500495 5.24888 100
microbenchmark(lapply(r, function(x) { data<-append(data, x) }), unit="ms")
#> Unit: milliseconds
#> expr min lq
#> lapply(r, function(x) { data <- append(data, x) }) 3.014673 3.091299
#> mean median uq max neval
#> 3.287216 3.150052 3.260199 6.036501 100
microbenchmark(method1(r), unit="ms")
#> Unit: milliseconds
#> expr min lq mean median uq max neval
#> method1(r) 3.938684 3.978002 5.71831 4.020001 4.280521 98.58584 100
Не осознавал, что ОП требуется только каждый четвертый. Почему бы просто не использовать кадр данных или таблицу данных?
d <- data.frame(matrix(rnorm(1000), ncol=1))
microbenchmark(d2 <- d[seq(1,nrow(d), 4),])
#> Unit: microseconds
#> expr min lq mean median uq
#> d2 <- d[seq(1, nrow(d), 4), ] 64.846 65.9915 73.08007 67.225 73.8225
#> max neval
#> 220.438 100
library(data.table)
dt <- data.table(d)
microbenchmark(d2 <- dt[seq(1,nrow(d), 4),])
#> Unit: microseconds
#> expr min lq mean median uq
#> d2 <- dt[seq(1, nrow(d), 4), ] 298.163 315.2025 324.8793 320.554 330.416
#> max neval
#> 655.124 100
Лучший способ перейти - предварительно выделить «вне» вектор и скопировать все там. –
Непонятно, что вы спрашиваете. Не могли бы вы создать вектор индексов, например 'j' и использовать его для подмножества вашей векторной строки? Затем выполните 'data <- line [j]'. –
Сделайте воспроизводимый пример, включая желаемый результат. – Frank