Я отправляю ответ только потому, что у меня недостаточно репутации, чтобы комментировать или голосовать за него до сих пор.
Главный ответ, что pmax
в ~ 10 раз быстрее, чем apply
, - нет.всегда правильно.Например, вычислите максимум для 10 ^ 6 чисел в каждом столбце.
data <- matrix(rnorm(10^8), 10^6)
data.t <- t(data)
data.df <- data.frame(data)
data.t.df = data.frame(data.t)
system.time(a <- apply(data, MARGIN=c(2), max))
system.time(b <- sapply(data.df, max))
system.time(e <- sapply(seq_len(ncol(data)), function(x) max(data[, x])))
system.time(c <- do.call(pmax, data.t.df))
system.time(d <- colMaxs(data))
> system.time(a <- apply(data, MARGIN=c(2), max))
user system elapsed
2 0 2
> system.time(b <- sapply(data.df, max))
user system elapsed
0.25 0.00 0.25
> system.time(e <- sapply(seq_len(ncol(data)), function(x) max(data[, x])))
user system elapsed
0.83 0.00 0.83
> system.time(c <- do.call(pmax, data.t.df))
user system elapsed
15.94 0.00 15.96
> system.time(d <- colMaxs(data))
user system elapsed
0.21 0.00 0.20
Теперь вычислите максимум для 100 чисел в каждом столбце.
system.time(a <- apply(data.t, MARGIN=c(2), max))
system.time(b <- sapply(data.t.df, max))
system.time(e <- sapply(seq_len(ncol(data.t)), function(x) max(data.t[, x])))
system.time(c <- do.call(pmax, data.df))
system.time(d <- colMaxs(data.t))
> system.time(a <- apply(data.t, MARGIN=c(2), max))
user system elapsed
4.41 0.00 4.42
> system.time(b <- sapply(data.t.df, max))
user system elapsed
3.23 0.00 3.23
> system.time(e <- sapply(seq_len(ncol(data.t)), function(x) max(data.t[, x])))
user system elapsed
3.57 0.00 3.57
> system.time(c <- do.call(pmax, data.df))
user system elapsed
1.56 0.00 1.56
> system.time(d <- colMaxs(data.t))
user system elapsed
0.25 0.00 0.25
Похоже, что pmax
скорость сопоставима или лучше apply
только при небольшом количестве строк (например, 100).Когда количество строк велико (например, 10 ^ 6), pmax
намного медленнее, чем apply
.
В любом случае, colMaxs
в пакете matrixStats
является самым быстрым, и кажется,быть в пути.