2012-04-13 39 views
4

我的文件有:R 「爲我」 的排序順序情節

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

我想與R.

繪製他們

通常我做這個:

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]) 
.... 

但是R以這樣的順序繪製它們:

「CT.BP.200.txt」「CT.BP.500.txt」「CT.BP.50.txt」

「GP.BP.200.txt」 「GP.BP.500.txt」 「GP.BP.50.txt」

而且我希望他們按照排序順序繪製:

「CT.BP.50.txt」 「CT.BP.200.txt」 「CT.BP.500.txt」

「GP.BP.50.txt」「GP.BP.200 .txt「」GP.BP.500.txt「

我該怎麼做?

回答

2

可能這樣做嗎?

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

我應該怎樣自動 「C」 文件時存在(> 100) – PoGibas 2012-04-13 16:15:53

+0

哦更多人。聽起來你只有6個文件。 – 2012-04-13 16:16:50

1

它看起來像要按特定順序按文件名的特定組件排序。

所以我會打破文件名到其組件的東西,如啓動:

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

然後提取想要的排序列。

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

varname=filesmat[,1] 

然後以某種重新排序文件名類似

files=files[order(varname,numbercomponent)] 

然後,只需畫出任何你想要的。

11

問題是list.files()以標準(詞彙)排序順序返回文件名,並且數字按位置而不是數字的一部分進行比較。

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")) 

在我的系統,這給:

> 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" 

功能gtools::mixedsort會(一般)排序你想要的方式:在一串串的數字將作爲排序目的號碼進行處理。儘管如此,你的示例有一點障礙,因爲mixedsort假定.是數字的一部分,因此將.200.看作潛在的數字,實際上它不能作爲數字排序。既然你的例子裏沒有實際的小數點,你可以繞過這個。

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

因此現在文件的排序爲:

> 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 - 我不知道mixedsort。謝謝你。 – Dason 2012-04-13 17:04:37