どのようにNULLをいくつかの長さでリストを展開するには?

Given a list whose length <= N, what is the best/most efficient way to fill it up with trailing NULLs up to length (so that it has length N).

これはまあまあの言葉では1ライナーですが、Rのいくつかの行でそれを(効率的に)実行する手がかりがないので、すべてのコーナーケース(ゼロの長さのリストなど)で動作します。 。

3

6 答え

それは本当にシンプルに保ちましょう:

tst<-1:10 #whatever, to get a vector of length 10
tst<-tst[1:15]
7
追加された
それでおしまい。このソリューションは、Matthew Dowleが提案したソリューションより2倍高速で、私の不器用なソリューションは約5倍高速です。
追加された 著者 eold,
うん、これは大きなリストの方がずっと高速です。ありがとう。
追加された 著者 eold,
@leden。さらにもう1つの方法は、単に length(tst)= 15 です。それより速い?どのようにテストしましたか?
追加された 著者 Matt Dowle,
これはどのようにリストですか? :)
追加された 著者 Roman Luštrik,
けっこうだ。 :)
追加された 著者 Roman Luštrik,
@RomanLuštrik:ahem。幸いにも、 tst <-list(1,2,3)でも動作します。もちろん、リストはベクターの特殊なケースに過ぎないので、もっと一般的な解決法を提供すると思いました。 <�咳/>
追加された 著者 Nick Sabbe,

これを試して :

> 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

>
6
追加された

これはどう ?

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

[[2]]
[1] 1 2 3

[[3]]
NULL

[[4]]
NULL

[[5]]
NULL
5
追加された

リストの長さを直接編集することは、私が言うことができる限り、最速に見える:

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

しかし、あなたが非常に長いリストでこれをたくさんしない限り、違いは巨大ではありません。

4
追加された

私は短い方法があると確信していますが、私はそうする傾向があります:

l <- as.list(1:10)
N <- 15
l <- c(l, as.list(rep(NA, N - length(l) )))
1
追加された

こんにちは:あなたが実際のリストについて話していたかどうかは分かりませんが、もしそうだったら、下の方がうまくいくでしょう。これは、リストにあるベクトルの要素にアクセスすると、そこにないベクトルの要素にアクセスすると、その長さにベクトルが展開されるためです。

length <- 10
temp <- list("a","b")
print(temp)
temp[length] <- NULL
print(temp)
0
追加された