给定一个列表,其长度为<=
N,最长/最有效的填充方式是填充最大长度为NULL
s(因此长度为N)。如何使用NULL扩展列表达到一定的长度?
这是一种在任何体面语言中都是单线的东西,但我不知道如何在R的几行中有效地做到这一点,以便它适用于每个角落案例(零长度列表等)。
给定一个列表,其长度为<=
N,最长/最有效的填充方式是填充最大长度为NULL
s(因此长度为N)。如何使用NULL扩展列表达到一定的长度?
这是一种在任何体面语言中都是单线的东西,但我不知道如何在R的几行中有效地做到这一点,以便它适用于每个角落案例(零长度列表等)。
让我们保持它很简单:
tst<-1:10 #whatever, to get a vector of length 10
tst<-tst[1:15]
我敢肯定,有更短的方式,但我会倾向于做:
l <- as.list(1:10)
N <- 15
l <- c(l, as.list(rep(NA, N - length(l))))
你好:我不知道,如果你在谈论一个实际的名单,但是,如果你是,下面将工作。它的工作原理是,一旦你访问了一个不存在的向量(它是一个列表)的元素,R就会将该向量扩展到那个长度。
length <- 10
temp <- list("a","b")
print(temp)
temp[length] <- NULL
print(temp)
试试这个:
> l = list("a",1:3)
> N = 5
> l[N+1]=NULL
> l
[[1]]
[1] "a"
[[2]]
[1] 1 2 3
[[3]]
NULL
[[4]]
NULL
[[5]]
NULL
>
这个怎么样?
> l = list("a",1:3)
> length(l)=5
> l
[[1]]
[1] "a"
[[2]]
[1] 1 2 3
[[3]]
NULL
[[4]]
NULL
[[5]]
NULL
直接编辑列表的长度似乎是最快的,据我可以告诉:
tmp <- vector("list",5000)
sol1 <- function(x){
x <- x[1:10000]
}
sol2 <- function(x){
x[10001] <- NULL
}
sol3 <- function(x){
length(x) <- 10000
}
library(rbenchmark)
benchmark(sol1(tmp),sol2(tmp),sol3(tmp),replications = 5000)
test replications elapsed relative user.self sys.self user.child sys.child
1 sol1(tmp) 5000 2.045 1.394952 1.327 0.727 0 0
2 sol2(tmp) 5000 2.849 1.943383 1.804 1.075 0 0
3 sol3(tmp) 5000 1.466 1.000000 0.937 0.548 0 0
但差别并不大,除非你这个做了很多很长列表,我想。
就是这样。这个解决方案比Matthew Dowle提出的解决方案快两倍,比我笨拙的解决方案快了约5倍。 – eold
@leden。另一种方法就是“长度(tst)= 15”。任何更快?你是怎么测试的? –
是的,这对于大型列表来说更快。谢谢。 – eold