2016-01-02 46 views
6

我在dplyr,tidyr中做了一系列事情,因此如果可能的话,希望保留管道解决方案。添加NA以使所有列表元素长度相等

我有在各构成要素的数量不均衡的列表:我想知道,如果有一个整洁的一个衬垫,以每个元素填补了来港,使得它们都是相同长度的

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 

具有最大的项目元素:

我有2衬垫:

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 

想知道如果我失去了一些东西更快/更优雅。

回答

12

你可以使用

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 

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

从来没有意识到,你可以只是简单地覆盖对象的长度。太好了! – MichaelChirico

+1

我也不知道 - 有没有人有任何关于这个功能发生了什么?即“长度< - ”'的其他用途? – jalapic

+1

这只是lapply(lolz,function(x){length(x)< - max(长度(lolz)); x})'的简写形式。并且'length(x)< - value' _“可以用来重置一个向量的长度,如果一个向量被缩短,那么额外的值被丢弃,当一个向量被延长时,它会被NAs填充到新的长度(对于原始矢量,nul)“_(见'?length') – lukeA

相关问题