0

在 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功能有一个简单的答案,但我无法弄清楚。抱歉,如果以前有人问过这个问题。谢谢!

4

2 回答 2

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

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

lmax <- max(lengths(l))
于 2012-04-21T17:06:29.497 回答
2

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

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

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

sapply(dat, list)
于 2012-04-21T16:37:20.257 回答