在R列表中为不等大小的对象重复元素

时间:2012-04-21 16:25:06

标签: r lapply

在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函数有一个简单的答案,但我无法理解。如果之前已经问过这个问题,请道歉。谢谢!

2 个答案:

答案 0 :(得分: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.0开始,可以使用lengths(l)代替sapply(l,length)

lmax <- max(lengths(l))

答案 1 :(得分:2)

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

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

您现在可以直接使用该结构进行操作,但如果您想再次创建单独的列表,请使用sapply将其拆分为单独的列表:

sapply(dat, list)