色々な条件により細かい部分は異なるが,以下のようなプログラムによって分かったことは衝撃的?
nr <- 10000
nc <- 1000
x <- matrix(rnorm(nr*nc), nr, nc)
d <- as.data.frame(x)
# データフレームに対して
## for ループ
gc();gc();system.time({
m1 <- numeric(nc)
for (i in 1:nc) {
m1[i] <- mean(d[,i])
}
})
## apply
system.time({
m2 <- apply(d, 2, mean)
})
## colMeans
system.time({
m3 <- colMeans(d)
})
## sapply
system.time({
m4 <- sapply(d, mean)
})
# 行列に対して
## for ループ
system.time({
M1 <- numeric(nc)
for (i in 1:nc) {
M1[i] <- mean(x[,i])
}
})
## apply
system.time({
M2 <- apply(x, 2, mean)
})
## colMeans
system.time({
M3 <- colMeans(x)
})
1. 行列に対しての colMeans が一番速い
2. 行列では apply より for の方が速い
3. データフレームでは for が一番速い
4. データフレームでは colMeans はたいして速くない
5. apply はいずれに対しても一番遅い
その他,結果の通り!!