最快的扩展顺序

时间:2014-12-13 04:40:52

标签: r

假设我们有一个向量1:5。我怎样才能遍历并且每次都采用向量的1:i,创建一个新的向量?

这是一种较慢的方法。我希望用rep或我没想到的东西更快:

n <- 5
nrows <- 1:n
unlist(lapply(nrows, function(i) nrows[1:i]))

[1] 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5

向上扩展使n更大。

2 个答案:

答案 0 :(得分:7)

你可以做到

sequence(1:n)

这是短暂的,打败其他一切......(到目前为止)。我也找到了

sequence(sequence(n))
有点令人满意。速度是一样的。

答案 1 :(得分:2)

也许data.table

library(data.table)
setkey(as.data.table(seq(n)), V1)[,list(V2=seq(V1)), by=V1]$V2

或者

 n1 <- 1:n
 seq_len(sum(n1))-rep(cumsum(c(0L, n1[-length(n1)])), n1) 

基准

 f1 <- function() {nrows <- 1:n
                unlist(lapply(nrows, function(i) nrows[1:i]))}

 f2 <- function() {setkey(as.data.table(1:n), V1)[, list(V2=1:V1), by=V1]$V2}

 f3 <- function() {n1 <- 1:n
                seq_len(sum(n1)) - rep(cumsum(c(0L, n1[-length(n1)])), n1)}

 library(microbenchmark)
 n <- 20000
 microbenchmark(f1(), f2(), f3(), unit='relative', times=10L)
 #Unit: relative
 #expr      min       lq     mean   median       uq      max neval cld
 #f1() 2.164453 2.329069 2.294095 2.376760 2.331996 2.159276    10   c
 #f2() 1.845572 1.885210 1.997209 2.030375 2.094401 2.147525    10  b 
 #f3() 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000    10 a