我有一些我正在列出的文件:
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"
答案 0 :(得分:1)
所以看起来mixedsort
只会对字符串中找到的第一组数字进行排序。在你的例子中,它首先对所有300个进行排序,然后在日期和时间进行字符排序。我将下面的示例数据更改为使用file310
和file301
,以便您可以看到正在发生的事情。
(编辑示例)
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是字符串最后一个字符的位置。当然,在这个例子中,这是一个过高的估计值!