我正在寻找将所有100000列表合并到数据帧中的最快方法。 union all不是do.call(rbind)问题,因为我想在输出中放入一列并在组中添加每个列表的最小值(为了更好地理解输出,请参阅下面的代码)。
我尝试了两种不同的东西,但效果很慢,所以我正在使用data.table或dplyr或任何能让它变得更好的东西来搜索。
重现我想要的例子:
a <- c(1:3)
b <- c(12:20)
relations <- list(a,b)
使用我尝试的两种不同解决方案输出。
1 - 解决方案基本上将数据帧与rbind循环连接在列表元素上:
full_group <- NULL
for(i in 1:length(relations))
{
full_group = rbind( full_group,
data.frame( id = relations[[i]] ,
group = min( relations[[i]])) )
print(i)
}
2解决方案:连接向量,然后从结果中创建一个数据帧:
full_group <- NULL
groups <- NULL
id <- NULL
for(i in 1:length(relations))
{
id <- c(id , relations[[i]] )
groups <- c( groups , rep( min(relations[[i]]) , length(relations[[i]]) ) )
print(i)
}
full_group = data.frame( id = id ,
groups = groups )
答案 0 :(得分:4)
根据您的第二个解决方案输出判断,您需要stack
列出的内容
stack(setNames(relations,sapply(relations,min)))
values ind 1 1 1 2 2 1 3 3 1 4 12 12 5 13 12 6 14 12 7 15 12 8 16 12 9 17 12 10 18 12 11 19 12 12 20 12
此处setNames
的调用设置了组的名称,这里是每个列表的最小元素。相同的代码与melt
中的reshape2
代替stack
,而@akrun指出的可能更快。
stack2 <- function(x,i) data.frame(values=unlist(x), ind=rep.int(i, lapply(x, length)))
stack2(relations,sapply(relations,min))
这是@alexis_laz在评论中提出的建议。