如何以正常方式订购文件?

时间:2015-07-20 16:38:31

标签: r

我有一些我正在列出的文件:

dir <- list.files("/data/2014", "*.img$", full.names = TRUE)

dir中列出的文件示例:

"/data/2014/file300.data.20141231.MC.9.vgf.img"

因此所有文件都具有相同的名称,但会更改日期20141231和小时9

R根据日期列出文件,这很好,但它错过了小时:

    10 1 11 12.....20 2 21 22....24 3 4....   

应为0 1 2 3 4 5 6 ..... 10 11 ..... 20 21 .... 24

我在mixedsort尝试gtools但没有成功。

xx <- c('file300.data.20141231.MC.10.vgf.img', 'file300.data.20141231.MC.24.vgf.img',
'file300.data.20141231.MC.9.vgf.img', 'file300.data.20141231.MC.1.vgf.img',
'file300.data.20141231.MC.2.vgf.img')

xx 
# [1] "file300.data.20141231.MC.10.vgf.img"                       
# [2] "file300.data.20141231.MC.24.vgf.img" 
# [3] "file300.data.20141231.MC.9.vgf.img" 
# [4] "file300.data.20141231.MC.1.vgf.img"
# [5] "file300.data.20141231.MC.2.vgf.img" 

现在测试mixedsort()

dir1 <- mixedsort(xx)
dir1 
# [1] "file300.data.20141231.MC.10.vgf.img" 
# [2] "file300.data.20141231.MC.1.vgf.img" 
# [3] "file300.data.20141231.MC.2.vgf.img" 
# [4] "file300.data.20141231.MC.24.vgf.img" 
# [5] "file300.data.20141231.MC.9.vgf.img"

我想要的是这样的:

# [1] "file300.data.20141231.MC.1.vgf.img" 
# [2] "file300.data.20141231.MC.2.vgf.img" 
# [3] "file300.data.20141231.MC.9.vgf.img" 
# [4] "file300.data.20141231.MC.10.vgf.img" 
# [5] "file300.data.20141231.MC.24.vgf.img"

2 个答案:

答案 0 :(得分:1)

所以看起来mixedsort只会对字符串中找到的第一组数字进行排序。在你的例子中,它首先对所有300个进行排序,然后在日期和时间进行字符排序。我将下面的示例数据更改为使用file310file301,以便您可以看到正在发生的事情。

(编辑示例)

xx <- c('file300.data.20141231.MC.10.vgf.img',
        'file300.data.20141231.MC.24.vgf.img',
        'file300.data.20141231.MC.9.vgf.img',
        'file300.data.20141231.MC.1.vgf.img',
        'file300.data.20141231.MC.2.vgf.img')

gtools::mixedsort(xx)

library(dplyr)
library(stringr)
data_frame(xx = xx) %>%
  bind_cols(., 
            as.data.frame(str_split_fixed(xx, "[.]", 7),
                          stringsAsFactors=FALSE)) %>%
  mutate(V5 = as.numeric(V5)) %>%
  arrange(V1, V3, V5)

答案 1 :(得分:1)

xx <- c('file300.data.20141231.MC.10.vgf.img',
    'file300.data.20141231.MC.24.vgf.img',
    'file300.data.20141231.MC.9.vgf.img',
    'file300.data.20141231.MC.1.vgf.img',
    'file300.data.20141231.MC.2.vgf.img')
xxx <- unlist(strsplit(substr(xx, 26, 50), split=".v"))
yyy <- as.numeric(xxx[rep(c(T, F), length.out=length(xxx))])
xx[order(yyy)]

50是字符串最后一个字符的位置。当然,在这个例子中,这是一个过高的估计值!