2012-04-13 6 views
4

Meine Dateien sind:R "für i in" Plot in sortierter Reihenfolge

CT.BP.50.txt 
CT.BP.200.txt 
CT.BP.500.txt 
GP.BP.50.txt 
GP.BP.200.txt 
GP.BP.500.txt 
.... 

ich sie mit R. plotten möchten

Normalerweise mache ich es durch diese:

files <- list.files() 
par(mfrow=c(3,3)) 
for (i in 1:length(files)) { 
b <- read.table(files[i]) 
barplot(table(b$V1), main=files[i]) 
.... 

Aber R stellt sie in der folgenden Reihenfolge dar:

"CT.BP.200.txt" "CT.BP.500.txt" "CT.BP.50.txt"

"GP.BP.200.txt" "GP.BP.500.txt" "GP.BP.50.txt"

Und ich möchte, dass sie in sortierter Reihenfolge aufgetragen werden:

"CT.BP.50.txt" "CT.BP.200.txt" "CT.BP.500.txt"

"GP.BP.50.txt" „GP.BP.200 .txt "" GP.BP.500.txt "

Wie kann ich das tun?

Antwort

2

Könnte dies tun?

files <- c("Gen.Var_CT.BP.50.txt", "Gen.Var_CT.BP.200.txt", "Gen.Var_CT.BP.500.txt", "Gen.Var_GP.BP.50.txt", "Gen.Var_GP.BP.200.txt", "Gen.Var_GP.BP.500.txt"){ 
for (i in 1:length(files)) { 
    b <- read.table(files[i]) 
    barplot(table(b$V1), main=files[i]) 
+1

Wie soll ich automatisch "c" Dateien, wenn es viel mehr von ihnen (> 100) – PoGibas

+0

Oh. Es klang, als hättest du gerade 6 Dateien. –

1

Es sieht so aus, als ob Sie nach bestimmten Komponenten Ihres Dateinamens in einer bestimmten Reihenfolge sortieren möchten.

filesmat=matrix(unlist(strsplit(files,split='\\.')),byrow=T,ncol=4) 

extrahieren Spalten, die Sie sortieren möchten:

So würde ich durch das Brechen der Dateinamen in seine Komponenten mit so etwas wie starten.

numbercomponent=as.numeric(filesmat[,3]) 

varname=filesmat[,1] 

neu ordnen Sie dann die Dateinamen mit so etwas wie

files=files[order(varname,numbercomponent)] 

dann sowieso nur plotten Sie wollen.

11

Das Problem ist, dass list.files() die Dateinamen in (lexikalisch) sortierter Standardreihenfolge zurückgibt und die Ziffern Position für Position und nicht als Teil einer Nummer verglichen werden.

files <- sort(c("Gen.Var_CT.BP.200.txt", "Gen.Var_CT.BP.500.txt", 
       "Gen.Var_CT.BP.50.txt", "Gen.Var_GP.BP.200.txt", 
       "Gen.Var_GP.BP.500.txt", "Gen.Var_GP.BP.50.txt")) 

Auf meinem System, das gibt:

> files 
[1] "Gen.Var_CT.BP.200.txt" "Gen.Var_CT.BP.50.txt" "Gen.Var_CT.BP.500.txt" 
[4] "Gen.Var_GP.BP.200.txt" "Gen.Var_GP.BP.50.txt" "Gen.Var_GP.BP.500.txt" 

Die Funktion gtools::mixedsort wird (im Allgemeinen) sortieren, wie Sie wollen: Ziffernfolge in einer Zeichenfolge zu Sortierzwecken als Zahlen behandelt werden. Es gibt jedoch ein kleines Problem mit Ihrem Beispiel, denn mixedsort geht davon aus, . sind Teil der Nummern und so sieht .200. als eine mögliche Zahl, die nicht tatsächlich als eine Zahl sortiert werden kann. Da Ihre Beispiele keine tatsächlichen Dezimalstellen enthalten, können Sie dies umgehen.

files <- files[mixedorder(gsub("\\.", " ", files))] 

So Dateien wird nun sortiert, wie:

> files 
[1] "Gen.Var_CT.BP.50.txt" "Gen.Var_CT.BP.200.txt" "Gen.Var_CT.BP.500.txt" 
[4] "Gen.Var_GP.BP.50.txt" "Gen.Var_GP.BP.200.txt" "Gen.Var_GP.BP.500.txt" 
+1

+1 - Ich wusste nichts über mixedsort. Danke für das. – Dason