我的档案是:
CT.BP.50.txt
CT.BP.200.txt
CT.BP.500.txt
GP.BP.50.txt
GP.BP.200.txt
GP.BP.500.txt
files <- c("CT.BP.50.txt", "CT.BP.200.txt", "CT.BP.500.txt", "GP.BP.50.txt", "GP.BP.200.txt", "GP.BP.500.txt")
我想对它们执行特定操作,我可以这样做:
for (i in 1:length(files)) {
foo <- read.table(files[i])
barplot(table(foo$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”
如何使用字母数字名称对对象进行排序?
答案 0 :(得分: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 :(得分: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])
答案 2 :(得分:1)
您似乎希望按特定顺序按文件名的特定组件进行排序。
所以我首先将文件名分解为其组件,如:
filesmat=matrix(unlist(strsplit(files,split='\\.')),byrow=T,ncol=4)
然后提取要排序的列。
numbercomponent=as.numeric(filesmat[,3])
varname=filesmat[,1]
然后用
之类的东西重新排序文件名files=files[order(varname,numbercomponent)]
然后只是你想要的情节。