給定一個列表,其長度爲<=
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