2016-08-09 146 views
6

Ich hatte eine vorherige (ähnlich) post here geschrieben, wo ich versuchte, eine breite Tabelle im Gegensatz zu einer langen Tabelle zu erstellen. Ich erkannte, dass es am besten ist, meinen Tisch im langen Format zu haben, also poste ich ihn als eine andere Frage. Ich poste auch, was ich versucht habe.R: Zeilenbindung sehr große Anzahl von Dateien in einer schnellen Art und Weise

ich R bin mit etwa ~ 11000 Dateien rbind mit:

# get list of ~11000 files 
lfiles <- list.files(pattern = "*.tsv", full.names = TRUE) 

# row-bind the files 
# use rbindlist to rbind and fread to read files 
# use mclapply I am assigning 32 cores to it 
# add the file basename as the id to identify rows 
dat <- rbindlist(mclapply(lfiles, function(X) { 
data.frame(id = basename(tools::file_path_sans_ext(X)), 
      fread(X))},mc.cores = 32)) 

I R verwenden, weil meine Weiterverarbeitung wie Plots usw. zu schaffen, in R. I zwei Fragen:

1 Gibt es eine Möglichkeit, meinen Code effizienter/schneller zu machen? Ich kenne die Anzahl der Zeilen, die am Ende erwartet werden, also wird es helfen, wenn ich den Datenrahmen vorberechne?

2. Wie soll ich (in welchem ​​Format) diese riesigen Daten speichern - als .RData oder als Datenbank oder etwas anderes?

Als zusätzliche Information: Ich habe drei Arten von Dateien, für die ich dies tun möchte. Sie sehen so aus:

[[email protected] data]$ head C021_0011_001786_tumor_RNASeq.abundance.tsv 
target_id length eff_length est_counts tpm 
ENST00000619216.1 68 26.6432 10.9074 5.69241 
ENST00000473358.1 712 525.473 0 0 
ENST00000469289.1 535 348.721 0 0 
ENST00000607096.1 138 15.8599 0 0 
ENST00000417324.1 1187 1000.44 0.0673096 0.000935515 
ENST00000461467.1 590 403.565 3.22654 0.11117 
ENST00000335137.3 918 731.448 0 0 
ENST00000466430.5 2748 2561.44 162.535 0.882322 
ENST00000495576.1 1319 1132.44 0 0 

[[email protected] data]$ head C021_0011_001786_tumor_RNASeq.rsem.genes.norm_counts.hugo.tab 
gene_id C021_0011_001786_tumor_RNASeq 
TSPAN6 1979.7185 
TNMD 1.321 
DPM1 1878.8831 
SCYL3 452.0372 
C1orf112 203.6125 
FGR 494.049 
CFH 509.8964 
FUCA2 1821.6096 
GCLC 1557.4431 

[[email protected] data]$ head CPBT_0009_1_tumor_RNASeq.rsem.genes.norm_counts.tab 
gene_id CPBT_0009_1_tumor_RNASeq 
ENSG00000000003.14 2005.0934 
ENSG00000000005.5 5.0934 
ENSG00000000419.12 1100.1698 
ENSG00000000457.13 2376.9100 
ENSG00000000460.16 1536.5025 
ENSG00000000938.12 443.1239 
ENSG00000000971.15 1186.5365 
ENSG00000001036.13 1091.6808 
ENSG00000001084.10 1602.7165 

Jede Hilfe würde sehr geschätzt werden!

Danke!

Antwort

5

Sie können nicht das viel schneller als fread und rbindlist in R. mit Aber, sollten Sie nicht data.frame verwenden und die Daten kopieren. Stattdessen zuweisen by reference:

DF <- fread(X) 
DF[, id := basename(tools::file_path_sans_ext(X))] 
return(DF) 

Allerdings sollten Sie eine Datenbank prüfen, mit.

PS: Der richtige Regex ist ".+\\.tsv$". Dies entspricht einem beliebigen Dateinamen mit einem oder mehreren Zeichen gefolgt von einem Punkt und der Zeichenfolge "tsv" gefolgt vom Ende des Dateinamens.

3

Zu Frage 1., kann ich nicht sicher sagen, ob es einen spürbaren Unterschied sein, aber man konnte die folgenden zu vermeiden, die data.frame Anrufe versuchen (wie durch @Roland in seiner Antwort erwähnt):

lfiles <- list.files(pattern = ".*\\.tsv$", full.names = TRUE) 
setattr(lfiles, "names", basename(lfiles)) 
dat <- rbindlist(mclapply(lfiles, fread, mc.cores = 32), idcol = "id") 

Hier können Sie das idcol -argument innerhalb rbindlist verwenden.

In Bezug auf Frage 2., ich denke, es hängt davon ab, was Sie später in Ihrer Analyse tun möchten.

+0

Was 'setnames ist (lfiles, Basisnamen (lfiles') tun? Es würde nicht funktionieren, weil lfiles kein Datenrahmen ist. –

+0

@KomalRathi, korrigiert 'setattr' zu verwenden, die auf den Listen funktioniert auch –