我会按照以下方式处理:
我会这样处理:
x <- list(c("10", "719", "99"),
c("10", "624", "85", "888", "624"),
c("1", "894", "110", "344", "634"))
first_elems <- sapply(x, "[", 1)
(first_elems <- as.factor(first_elems))
(group <- split(x, first_elems))
(result <- lapply(group, unlist))
编辑:对于非重复键,请使用以下方法:
(result <- lapply(group, function(x) {
c(x[[1]][1], unlist(lapply(x, "[", -1)))
}))
不需要太多额外的内存。除了我们需要存储as.factor
的结果列表(类别数量+x
中元素数量),我们还需要存储结果列表。 split
需要很少的额外内存 - x
中的向量没有进行深度复制。
至于性能,在相当大的列表中:
set.seed(1L)
n <- 100000
x <- vector('list', n)
for (i in 1:n)
x[[i]] <- as.character(sample(1:1000, ceiling(runif(1, 1, 1000)), replace=TRUE))
object.size(x)
我在我的旧Linux笔记本上获得了以下运行时间:
system.time(local({
first_elems <- as.factor(sapply(x, "[", 1))
group <- split(x, first_elems)
result <- lapply(group, function(x) {
c(x[[1]][1], unlist(lapply(x, "[", -1)))
})
}))
我认为这很合理。