2016-03-21 6 views
0

100000リストをすべてデータフレームに結合する最も速い方法を探しています。 ユニオンはdo.call(rbind)の問題ではありません。出力を1つの列に入れ、グループ内の各リストの最小値を追加したいからです。最も早くユニオン化する方法

私は2つの異なるものを試しましたが、かなり遅いので、data.tableまたはdplyrなどを使用して何かを探しています。

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

出力私が試した二つの異なる溶液で:私が欲しいものを再現する

例。

1 - rbindは、リストの要素の上にループを有する溶液基本的連結データフレーム:結果からAAデータフレームを作成し、次にCONCATENATEベクトルと:

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(relation)'と 'rep(sapply(relations、min)、lengths(relations))'を使うことができます。 –

+0

'data.table :: rbindlist'について、関連するSOの質問を読む:https://stackoverflow.com/questions/15673550/why-is-rbindlist-better-than-rbind – jangorecki

答えて

4

を判断

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溶液2番目のソリューションの出力によって、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と呼ぶと、グループの名前が設定されます。ここでは、各リストの最小要素です。同じコードは、stackの代わりにからreshape2で動作しますが、@akrunの方が速いかもしれません。

ただし、スタックとメルトは、グループを要素と文字としてそれぞれ保存します。数値は、(おそらく、ここでは)必要な場合は、@alexis_lazはコメントで示唆されたように、これはその基礎となるコード

stack2 <- function(x,i) data.frame(values=unlist(x), ind=rep.int(i, lapply(x, length))) 

stack2(relations,sapply(relations,min)) 

の若干の修正を使用しています。

+0

あなたのソリューションはどちらもとても速いです。答えをありがとう! – patpat

関連する問題