Innym sposobem byłoby
do.call("rbind", sapply(1:20, FUN = function(i) c(i+i,i*i,i/1), simplify = FALSE))
[,1] [,2] [,3]
[1,] 2 1 1
[2,] 4 4 2
[3,] 6 9 3
[4,] 8 16 4
[5,] 10 25 5
[6,] 12 36 6
Jeśli nie podasz simplify = FALSE
, musisz przetransponować wynik za pomocą t
. Może to być uciążliwe dla dużych konstrukcji.
To rozwiązanie jest szczególnie przydatne, jeśli masz zestaw danych po dużej stronie i/lub musisz go powtarzać wiele razy.
Oferuję pewne takty rozwiązań w tym "wątku".
> system.time(do.call("rbind", sapply(1:20000, FUN = function(i) c(i+i,i*i,i/1), simplify = FALSE)))
user system elapsed
0.05 0.00 0.05
> system.time(ldply(1:20000, function(i)c(i+i, i*i, i/1)))
user system elapsed
0.14 0.00 0.14
> system.time({d <- matrix(nrow=20000, ncol=3)
+ for (i in 1:20000) { d[i,] <- c(i+i, i*i, i/1)}})
user system elapsed
0.10 0.00 0.09
> system.time(ldply(1:20000, function(i)c(i+i, i*i, i/1)))
user system elapsed
62.88 0.00 62.99
Należy zauważyć, że jest to prawdopodobnie najmniej skuteczne rozwiązanie. W przypadku bardzo małych zbiorów danych nie będzie to miało większego znaczenia, ale naprawdę nie powinieneś używać pętli rbind lub cbind wewnątrz pętli, jeśli chcesz być efektywny. – Dason