2016-03-21 68 views
0

我正在寻找将所有100000列表合并成一个数据框的最快方法。 联合所有不是一个do.call(rbind)问题,因为我想在一列输出并添加组中的每个列表的最小值(为了更好地理解输出,请参阅下面的代码)。联合所有最快的方法

我已经尝试了两种不同的工作,但速度很慢,所以我正在寻找使用data.table或dplyr或任何可以使它更好的东西。

例重现我想要什么:

a <- c(1:3) 
b <- c(12:20) 
relations <- list(a,b) 

输出两种不同的解决方案,我试过了。

1 - 溶液基本上连接具有rbind循环上的列表中的元素dataframes:

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溶液:串连矢量,然后创建AA数据帧出来的结果:

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) 
+2

而不是重新分配“id”和“groups”,您可以分别使用'unlist(关系)'和'rep(sapply(关系,min),长度(关系))'。 –

+0

阅读关于'data.table :: rbindlist',相关的SO问题:https://stackoverflow.com/questions/15673550/why-is-rbindlist-better-than-rbind – jangorecki

回答

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此处设置组的名称,这里是每个列表的最小元素。相同的代码适用于reshape2melt,代替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被评价暗示。

+0

gosh,你的两个解决方案都是如此之快。感谢你的回答 ! – patpat

相关问题