Hoe een lijst met NULLen tot een bepaalde lengte uit te breiden?

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).

Dit is iets dat een one-liner is in elke fatsoenlijke taal, maar ik heb geen flauw idee hoe het (efficiënt) in een paar regels in R moet worden gedaan, zodat het voor elke corner-case werkt (nul-lengte lijst etc.) .

3

6 antwoord

Laten we het heel eenvoudig houden:

tst<-1:10 #whatever, to get a vector of length 10
tst<-tst[1:15]
7
toegevoegd
Dat is het. Deze oplossing is 2x sneller dan die van Matthew Dowle en ongeveer 5x sneller dan mijn onhandige oplossing.
toegevoegd de auteur eold, de bron
Ja, dit is zelfs sneller voor grote lijsten. Bedankt.
toegevoegd de auteur eold, de bron
@leden. Nog een andere manier is simpelweg length (tst) = 15 . Sneller? Hoe heb je getest?
toegevoegd de auteur Matt Dowle, de bron
Hoe is dit een lijst? :)
toegevoegd de auteur Roman Luštrik, de bron
Eerlijk genoeg. :)
toegevoegd de auteur Roman Luštrik, de bron
@ RomanLuštrik: ahem. Gelukkig werkt het ook voor tst <-list (1,2,3) . Maar een lijst is natuurlijk gewoon een speciaal geval van een vector, dus ik dacht dat ik de meer algemene oplossing zou bieden.
toegevoegd de auteur Nick Sabbe, de bron

Probeer dit :

> 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
toegevoegd

Wat denk je hiervan ?

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

[[2]]
[1] 1 2 3

[[3]]
NULL

[[4]]
NULL

[[5]]
NULL
5
toegevoegd

Rechtstreeks bewerken van de lengte van de lijst lijkt de snelste te zijn voor zover ik kan zien:

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

Maar de verschillen zijn niet groot, tenzij je dit veel doet op hele lange lijsten, neem ik aan.

4
toegevoegd

Ik weet zeker dat er kortere manieren zijn, maar ik zou geneigd zijn om te doen:

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

Hallo: Ik weet niet zeker of je het had over een echte lijst, maar als je dat wel was, werkt het onderstaande. Het werkt omdat, als je eenmaal toegang hebt tot het element van een vector (wat een lijst is) die er niet is, R de vector uitbreidt naar die lengte.

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