假设我们有一个向量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
更大。
答案 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