2016-01-02 9 views
6

Ich mache eine Reihe von Dingen in dplyr, tidyr, so würde ich gerne mit einer Piped-Lösung halten, wenn möglich.NA hinzufügen, um alle Listenelemente gleich lang zu machen

Ich habe eine Liste mit ungeraden Zahlen von Elementen in jeder Komponente:

lolz <- list(a = c(2,4,5,2,3), b = c(3,3,2), c=c(1,1,2,4,5,3,3), d=c(1,2,3,1), e=c(5,4,2,2)) 
lolz 
$a 
[1] 2 4 5 2 3 

$b 
[1] 3 3 2 

$c 
[1] 1 1 2 4 5 3 3 

$d 
[1] 1 2 3 1 

$e 
[1] 5 4 2 2 

Ich frage mich, ob es ein ordentlich einzeiler jedes Element mit NAs zu füllen, so dass sie alle der gleichen Länge wie das Element mit dem maximalen Artikel:

ich habe einen 2-Liner:

lolz %>% lapply(length) %>% unlist %>% max -> mymax 
lolz %>% lapply(function(x) c(x, rep(NA, mymax-length(x)))) 


$a 
[1] 2 4 5 2 3 NA NA 

$b 
[1] 3 3 2 NA NA NA NA 

$c 
[1] 1 1 2 4 5 3 3 

$d 
[1] 1 2 3 1 NA NA NA 

$e 
[1] 5 4 2 2 NA NA NA 

Frag dich, ob ich etwas fehle schneller/elegante.

Antwort

12

könnten Sie verwenden

lapply(lolz, `length<-`, max(lengths(lolz))) 
# $a 
# [1] 2 4 5 2 3 NA NA 
# 
# $b 
# [1] 3 3 2 NA NA NA NA 
# 
# $c 
# [1] 1 1 2 4 5 3 3 
# 
# $d 
# [1] 1 2 3 1 NA NA NA 
# 
# $e 
# [1] 5 4 2 2 NA NA NA 

oder

n <- max(lengths(lolz)) 
lapply(lolz, `length<-`, n) 
+0

nie realisiert, können Sie einfach die Länge eines Objektes überschreiben. nett! – MichaelChirico

+1

Ich wusste es auch nicht - hat irgendjemand irgendwelche Verweise darauf, was mit diesem funktional passiert? d.h. andere Verwendungen von "Länge <-"? – jalapic

+1

Es ist nur eine Kurzform für 'lapply (lolz, Funktion (x) {Länge (x) <- max (Längen (lolz)); x})'. Und 'length (x) <- value' _ "kann verwendet werden, um die Länge eines Vektors zurückzusetzen. Wenn ein Vektor verkürzt wird, werden zusätzliche Werte verworfen und wenn ein Vektor verlängert wird, wird er mit NAs auf seine neue Länge aufgefüllt (nul für rohe Vektoren) "_ (siehe'? length') – lukeA

Verwandte Themen