2012-04-21 60 views
0

在R中,我有一个列表,其中包含元素数量不等的对象。例如,为R列表中不等大小的对象重复元素

l <- list(a=c(1,2), b=3, c=4) 

我已经知道如何找到任何对象的最大长度:

lmax <- max(unlist(lapply(l,length))) 

,以及如何确定哪些对象是不是最长:

notlongest <- unlist(lapply(l,length)) != max(unlist(lapply(l,length))) 

我现在需要做的是:对于列表中的那些对象是notlongest,重复它们的元素的次数lmax并获得一个新列表。也就是说,对象B和C,重复它们的元素两次,所以我得到一个新的列表,看起来是这样的:

newl <- list(a=c(1,2), b=c(3,3), c=c(4,4)) 

我敢肯定有一个简单的答案与lapply功能,但我不能想办法。如果以前有人问过这个问题,请抱歉。谢谢!

+0

一些挑剔的使用,可以简化您的'不公开(lapply())'使用'sapply'连击。 – 2012-04-21 16:41:20

回答

3
lmax <- max(sapply(l,length)) 
ll <- lapply(l, function(x) c(x, rep(x, lmax-length(x))) ) 
ll 
$a 
[1] 1 2 

$b 
[1] 3 3 

$c 
[1] 4 4 

R 3.2.0lengths(l)可以代替sapply(l,length)

lmax <- max(lengths(l)) 
+0

太棒了,谢谢! – epidemics 2012-04-21 17:34:33

+0

更直接的方法,我懒得去想它+1 – 2012-04-21 17:58:10

+0

刚碰巧想,这是否适用于较少列表没有单一元素的情况? – 2012-04-21 19:37:40

2

最简单的方法是,我能想到的是使用的r回收规则和data.frame到组列表分成相等的长度列表的列表:

dat <- do.call('data.frame', l) 

现在你可以,但直接操作的是结构的如果你想再次创建单独列出了使用sapply打破它回到分割成单独的列表:

sapply(dat, list)