2013-10-23 4 views
5

私はこれがdplyrより多く、plyr質問より多いと思います。スピードのために私は書いたコードでdata.tableを使用しています。このdplyr + data.tableタスクを高速化できますか?

> bedbin.dt 
Source: local data table [32,138 x 4] 
Groups: chr 

    bin start   site chr 
1 2 3500000   ssCTCF 1 
2 3 4000000 ssCTCF+Cohesin 1 
3 3 4000000   ssCTCF 1 
4 4 4500000   ucCTCF 1 
5 4 4500000 ssCTCF+Cohesin 1 
6 4 4500000 ssCTCF+Cohesin 1 
7 4 4500000 ssCTCF+Cohesin 1 
8 4 4500000   ssCTCF 1 
9 4 4500000   ssCTCF 1 
10 5 5000000   ssCTCF 1 
.. ...  ...   ... ... 

EDIT

またはSO(手順については、リカルドSaportaにTHX)

のようなデータの最初の100行:中間ステップの間、私は〜32,000行を持ついくつかのゲノミクスデータを持つテーブルがあります
bedbin.dt <- data.table(structure(list(bin = c("2", "3", "3", "4", "4", "4", "4", "4","4", "5", "5", "7", "7", "7", "7", "7", "7", "8", "8", "9", "9","11", "12", "14", "14", "14", "14", "14", "14", "14", "14", "15","15", "15", "15", "15", "15", "15", "15", "15", "15", "16", "16","17", "17", "17", "18", "20", "20", "20", "21", "21", "21", "21","21", "21", "21", "21", "21", "21", "22", "22", "5057", "5057","5057", "5057", "5059", "5059", "5059", "5059", "5059", "5060","5060", "5060", "5060", "5060", "5060", "5061", "5063", "5063","5064", "5064", "5064", "5064", "5064", "5064", "5064", "5064","5064", "5064", "5064", "5064", "5064", "5064", "5064", "5064","5064", "5064", "5064", "5064"), start = c(3500000L, 4000000L,4000000L, 4500000L, 4500000L, 4500000L, 4500000L, 4500000L, 4500000L,5000000L, 5000000L, 6000000L, 6000000L, 6000000L, 6000000L, 6000000L,6000000L, 6500000L, 6500000L, 7000000L, 7000000L, 8000000L, 8500000L,9500000L, 9500000L, 9500000L, 9500000L, 9500000L, 9500000L, 9500000L,9500000L, 10000000L, 10000000L, 10000000L, 10000000L, 10000000L,10000000L, 10000000L, 10000000L, 10000000L, 10000000L, 10500000L,10500000L, 11000000L, 11000000L, 11000000L, 11500000L, 12500000L,12500000L, 12500000L, 13000000L, 13000000L, 13000000L, 13000000L,13000000L, 13000000L, 13000000L, 13000000L, 13000000L, 13000000L,13500000L, 13500000L, 162500000L, 162500000L, 162500000L, 162500000L,163500000L, 163500000L, 163500000L, 163500000L, 163500000L, 164000000L,164000000L, 164000000L, 164000000L, 164000000L, 164000000L, 164500000L,165500000L, 165500000L, 166000000L, 166000000L, 166000000L, 166000000L,166000000L, 166000000L, 166000000L, 166000000L, 166000000L, 166000000L,166000000L, 166000000L, 166000000L, 166000000L, 166000000L, 166000000L,166000000L, 166000000L, 166000000L, 166000000L), site = c("ssCTCF","ssCTCF+Cohesin", "ssCTCF", "ucCTCF", "ssCTCF+Cohesin", "ssCTCF+Cohesin","ssCTCF+Cohesin", "ssCTCF", "ssCTCF", "ssCTCF", "ssCTCF+Cohesin","ssCTCF", "ssCTCF+Cohesin", "ssCTCF+Cohesin", "ssCTCF", "ucCTCF","ucCTCF", "ucCTCF", "ssCTCF", "ssCTCF", "ssCTCF+Cohesin", "ssCTCF","ssCTCF+Cohesin", "ssCTCF", "ucCTCF", "ucCTCF", "ssCTCF", "ssCTCF+Cohesin","ssCTCF", "ssCTCF+Cohesin", "ssCTCF+Cohesin", "ssCTCF+Cohesin","ssCTCF+Cohesin", "ssCTCF", "ucCTCF", "ssCTCF+Cohesin", "ssCTCF","ssCTCF", "ssCTCF", "ssCTCF", "ssCTCF", "ssCTCF", "ssCTCF", "ssCTCF","ssCTCF", "ssCTCF", "ucCTCF", "ucCTCF", "ucCTCF", "ssCTCF", "ssCTCF","ssCTCF", "ssCTCF", "ssCTCF+Cohesin", "ssCTCF", "ssCTCF", "ssCTCF","ssCTCF", "ssCTCF", "ssCTCF", "ssCTCF+Cohesin", "ucCTCF", "ssCTCF","ssCTCF+Cohesin", "ssCTCF+Cohesin", "ssCTCF", "ucCTCF", "ssCTCF","ssCTCF+Cohesin", "ssCTCF", "ssCTCF", "ucCTCF", "ucCTCF", "ssCTCF","ucCTCF", "ssCTCF", "ucCTCF", "ucCTCF", "ssCTCF", "ssCTCF", "ucCTCF","ucCTCF", "ssCTCF", "ssCTCF", "ssCTCF", "ucCTCF", "ucCTCF", "ssCTCF","ssCTCF", "ssCTCF", "ssCTCF", "ssCTCF", "ssCTCF", "ssCTCF", "ucCTCF","ucCTCF", "ssCTCF+Cohesin", "ucCTCF", "ucCTCF", "ucCTCF"), chr = structure(c(1L,1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 20L, 20L,20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L,20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L,20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L), .Label = c("1","10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "2","3", "4", "5", "6", "7", "8", "9", "X"), class = "factor")), .Names = c("bin","start", "site", "chr"), sorted = "chr", class = c("data.table","data.frame"), row.names = c(NA, -100L)), key='chr') 

のEND EDIT

私は次のCREしたいです各行と他のすべての可能な組み合わせをすべて食べた(chrでグループ化)。私は事前に計算することが最良(最も単純な)を考えているので、これは他のいくつかのデータに(参加)クエリを形成することになる。

# grouped by chr column 
bedbin.dt = group_by(bedbin.dt, chr) 

# an outer like function 
outerFun= function(dt) 
    { 
    unique(data.table(
    x=dt[rep(1:nrow(dt),each =nrow(dt)),], 
    y=dt[rep.int(1:nrow(dt),times=nrow(dt)),])) 
    } 

> system.time((outer.bedbin.dt = do(bedbin.dt, outerFun1))) 
    user system elapsed 
90.607 13.993 105.536 

私の心に、これはsloooowwwwです...比較的data.frame、またはベースを使用する場合に比べものの、 by()lapply()のような機能はかなり高速です。しかし、これは実際に私がテストしている小さなデータセットです。

だから、もっと速いバージョンのouterFunについて誰かが考えているのだろうか? rep()またはrep.int()より速い方法がありますか?

+1

をやあ、あなたは再現例を投稿してくださいできますか? - 'reproduce()'を使うことができます。手順は以下の通りです:http://bit.ly/SORepro - [Rの再現性の高いサンプルの作成方法](http://bit.ly/SORepro) –

+0

@RicardoSaporta、こんにちは完全に再現可能な例。それについて考えてみましょう。おそらく私はそれを最初に作成するコードを作ることができますか? 1つの瞬間をしてください... –

+0

私が投稿したリンクを見てください。 'reproduce(bedbin.dt、rows = 100、cols = c(" bin "、" start "、..etc))' –

答えて

9

リカルドが指摘したように、あなたは、単にこの望むように聞こえる:

bedbin.dt[, CJ(1:.N, 1:.N), by = chr] 
+0

私はそれを変数 'tt'に格納してから、' cbind(dt [tt $ V1]、dt [tt $ V2]) 'を実行するべきだと思います。 – Arun

+0

こんにちはテストデータでは、これは私自身の関数(1936)に異なる回答(5288行)を与えます。しかし、CJは有望な機能のように見えますが、私はdata.tableの構文には本当に弱いです。ここで何が起こっているのか正確に感謝するまで私はgoogleとgoogleをいくつか必要としています。どうも。 –

+0

@StephenHenderson申し訳ありませんが、私は 'dplyr'をインストールすることはできませんし、そのコードが何をしているのかわかりません - これは私の最高の推測でした - ' CJ'はほぼ同じです 'expand.grid' btw – eddi

関連する問題