联合所有人的最快方式

时间:2016-03-21 14:58:08

标签: r

我正在寻找将所有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 ) 

1 个答案:

答案 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在评论中提出的建议。