我发布答案只是因为我还没有足够的声誉来发表评论或投票赞成/反对。
pmax 比 apply 快约 10 倍的最佳答案并不总是正确的。例如,计算每列中 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 仅在行数较少(例如 100)时的速度上与 apply 相当或更好。当行数很大时(例如 10^6),pmax 比apply 慢很多。
无论如何,matrixStats 包中的colMaxs 是最快的,而且似乎是要走的路。