2011-11-11 45 views
3

給定一個列表,其長度爲<=N,最長/最有效的填充方式是填充最大長度爲NULLs(因此長度爲N)。如何使用NULL擴展列表達到一定的長度?

這是一種在任何體面語言中都是單線的東西,但我不知道如何在R的幾行中有效地做到這一點,以便它適用於每個角落案例(零長度列表等)。

回答

7

讓我們保持它很簡單:

tst<-1:10 #whatever, to get a vector of length 10 
tst<-tst[1:15] 
+0

就是這樣。這個解決方案比Matthew Dowle提出的解決方案快兩倍,比我笨拙的解決方案快了約5倍。 – eold

+1

@leden。另一種方法就是「長度(tst)= 15」。任何更快?你是怎麼測試的? –

+0

是的,這對於大型列表來說更快。謝謝。 – eold

1

我敢肯定,有更短的方式,但我會傾向於做:

l <- as.list(1:10) 
N <- 15 
l <- c(l, as.list(rep(NA, N - length(l)))) 
0

你好:我不知道,如果你在談論一個實際的名單,但是,如果你是,下面將工作。它的工作原理是,一旦你訪問了一個不存在的向量(它是一個列表)的元素,R就會將該向量擴展到那個長度。

length <- 10 
temp <- list("a","b") 
print(temp) 
temp[length] <- NULL 
print(temp) 
6

試試這個:

> 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 

> 
5

這個怎麼樣?

> l = list("a",1:3) 
> length(l)=5 
> l 
[[1]] 
[1] "a" 

[[2]] 
[1] 1 2 3 

[[3]] 
NULL 

[[4]] 
NULL 

[[5]] 
NULL 
4

直接編輯列表的長度似乎是最快的,據我可以告訴:

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 

但差別並不大,除非你這個做了很多很長列表,我想。