2012-04-13 63 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