2013-10-23 8 views
5

Ich denke, das ist eher ein dplyr als plyr Frage. Der Geschwindigkeit wegen verwende ich data.table in irgendeinem Code, den ich geschrieben habe. Während eines Zwischenschritts habe ich eine Tabelle mit einigen genomics Daten mit ~ 32.000 Zeilen:Kann ich diese dplyr + data.table-Aufgabe schneller machen?

> 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

oder die ersten hundert Zeilen von Daten wie so (THX zu Ricardo Saporta für Anweisungen)

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

ich möchte neben cre aß alle möglichen Kombinationen jeder Reihe gegen jede andere (gruppiert nach CHR). Dies würde eine Abfrage (Join) auf einige andere Daten bilden, damit ich am besten denke (und einfachste) vorauszuberechnen:

# 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 

Meiner Meinung nach ist dies sloooowwww ... obwohl relativ im Vergleich zur Verwendung data.frame oder Base Funktionen wie by() oder lapply() ist es ziemlich viel schneller. Dies ist jedoch ein kleiner Datensatz, an dem ich ihn gerade teste.

Also ... Ich frage mich, ob jemand irgendwelche Ideen über eine schnellere Version von outerFun hat ??? Gibt es einen schnelleren Weg als rep() oder rep.int()?

+1

hallo, können Sie bitte ein reproduzierbares Beispiel posten? - Sie können 'reproduce ()' verwenden. Anleitung gibt es hier: http://bit.ly/SORepro - [Wie man ein großartiges R reproduzierbares Beispiel macht] (http://bit.ly/SORepro) –

+0

@RicardoSaporta, Hi ich bin mir nicht sicher wie ich das posten kann vollständig reproduzierbares Beispiel. Lass mich darüber nachdenken. Vielleicht kann ich Code erstellen, um es zuerst zu erstellen ?? Einen Moment bitte ... –

+0

schauen Sie sich den Link an, den ich gepostet habe. Sie können einfach 'reproduzieren (bedbin.dt, rows = 100, cols = c (" bin "," start ", .. etc))' –

Antwort

9

Wie Ricardo wies darauf hin, es klingt wie Sie einfach diese wollen:

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

Ich denke, Sie sollten das in einer Variablen speichern sagen, 'tt' und dann tun:' cbind (dt [tt $ V1], dt [tt $ V2]) ', nicht sicher, obwohl. – Arun

+0

Hallo auf die Testdaten das gibt eine andere Antwort (5288 Zeilen) auf meine eigene Funktion (1936) - und nicht alle Spalten, die ich will. Allerdings sieht CJ wie eine vielversprechende Funktion aus .... aber ich bin sehr schwach in der Data.table Syntax Ich muss googlen und einige bis ich genau zu schätzen weiß, was hier vor sich geht. Danke. –

+0

@StephenHenderson Entschuldigung, ich kann 'dplyr' nicht installieren und bin mir nicht sicher, was dieser Code tut - das war meine beste Vermutung -' CJ' ist ungefähr gleich 'expand.grid' btw – eddi

Verwandte Themen