在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 :(得分: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)