首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用R按排序顺序读取目录中的文件?

问如何使用R按排序顺序读取目录中的文件?
EN

Stack Overflow用户
提问于 2012-05-28 05:18:26
回答 4查看 6.2K关注 0票数 4

下面给出的代码运行良好,读取了我的目录中的文件并提取了值:

代码语言:javascript
复制
X <- c(75:85) ; Y <- c(208:215) 
extract <- vector()
files <- list.files("C:\\New folder (10)", "*.img",full.names=TRUE)

}

我试图通过使用sprintf来指定它,但是我得到了错误。如果有任何帮助,请:

代码语言:javascript
复制
for (i in c(1:365)) {
   fileName <- sprintf("C:New folder (10)/Climate_Rad_%d.img", i)
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-28 07:36:01

为什么不使用list.files()检索所有文件(具有特定模式),然后对其进行排序。然后从排序后的向量中检索文件,这将为您提供正确排序的文件。这样做的优点是,当1:365序列中缺少数字时,它也会起作用

类似于:

代码语言:javascript
复制
myFiles <- list.files(pattern = "^Climate_Rad_") #all files starting with Climate_
myFiles <- sort(myFiles)
# then read them in, for instance through
for (fileNames in myFiles) {READ.IN.AND.DO.YOUR.MAGIC.ON.THEM}
票数 4
EN

Stack Overflow用户

发布于 2012-05-29 02:56:45

啊,好的,我明白了,问题出在分类上。排序顺序按字母顺序是正确的。Climate_Rad_1后面是字母顺序,后面是Climate_Rad_10,而不是Climate_Rad_2。这个顺序根本不是“随机”的,它是字母顺序正确的。

但是,您希望在Climate_Rad_10之前处理Climate_Rad_2,而不是在之后。有几种方法可以解决这个问题。首先,您应该注意到,Climate_Rad_002按字母顺序排在Climate_Rad_010之前,所以如果您在生成文件时添加前导零,这将使以后以数字顺序处理文件变得容易。

或者,让我们假设您在创建文件时不能添加零。那么至少有两种方法仍然可以按顺序访问文件。要么在文件名后添加零,要么只对文件名的数字部分进行排序。

让我向您展示后者。

代码语言:javascript
复制
myFiles <- paste("Climate_Rad_", c(1:15, 95:110), ".img", sep = "") # create some test names, you get the actual myFiles through a call to list.files()

myFiles.sorted <- sort(myFiles) # this gives the alphabetic sorting, not what you want

> myFiles.sorted
 [1] "Climate_Rad_1.img"   "Climate_Rad_10.img"  "Climate_Rad_100.img"
 [4] "Climate_Rad_101.img" "Climate_Rad_102.img" "Climate_Rad_103.img"
 [7] "Climate_Rad_104.img" "Climate_Rad_105.img" "Climate_Rad_106.img"
[10] "Climate_Rad_107.img" "Climate_Rad_108.img" "Climate_Rad_109.img"
[13] "Climate_Rad_11.img"  "Climate_Rad_110.img" "Climate_Rad_12.img" 
[16] "Climate_Rad_13.img"  "Climate_Rad_14.img"  "Climate_Rad_15.img" 
[19] "Climate_Rad_2.img"   "Climate_Rad_3.img"   "Climate_Rad_4.img"  
[22] "Climate_Rad_5.img"   "Climate_Rad_6.img"   "Climate_Rad_7.img"  
[25] "Climate_Rad_8.img"   "Climate_Rad_9.img"   "Climate_Rad_95.img" 
[28] "Climate_Rad_96.img"  "Climate_Rad_97.img"  "Climate_Rad_98.img" 
[31] "Climate_Rad_99.img" 

# split between the part that comes before the numerics and the "1.img" etc.--adjust appropriately
split <- strsplit(myFiles.sorted, "Climate_Rad_") 
# strip the "1.img" etc such that only the numeric part is left
# turn the characters in numeric
split <- as.numeric(sapply(split, function(x) x <- sub(".img", "", x[2])))
# not you can sort, by using order, that gives the original filenames, ordered on the numeric part of the filename
myFiles.correct.order <- myFiles.sorted[order(split)]

 [1] "Climate_Rad_1.img"   "Climate_Rad_2.img"   "Climate_Rad_3.img"  
 [4] "Climate_Rad_4.img"   "Climate_Rad_5.img"   "Climate_Rad_6.img"  
 [7] "Climate_Rad_7.img"   "Climate_Rad_8.img"   "Climate_Rad_9.img"  
[10] "Climate_Rad_10.img"  "Climate_Rad_11.img"  "Climate_Rad_12.img" 
[13] "Climate_Rad_13.img"  "Climate_Rad_14.img"  "Climate_Rad_15.img"   
[16] "Climate_Rad_95.img"  "Climate_Rad_96.img"  "Climate_Rad_97.img" 
[19] "Climate_Rad_98.img"  "Climate_Rad_99.img"  "Climate_Rad_100.img"
[22] "Climate_Rad_101.img" "Climate_Rad_102.img" "Climate_Rad_103.img"
[25] "Climate_Rad_104.img" "Climate_Rad_105.img" "Climate_Rad_106.img"
[28] "Climate_Rad_107.img" "Climate_Rad_108.img" "Climate_Rad_109.img"
[31] "Climate_Rad_110.img"

这将为您提供您要查找的文件顺序。现在根据这一点拉取文件,例如通过

代码语言:javascript
复制
for (fileNames in myFiles.correct.order) {READ.IN.AND.DO.YOUR.THING}

这应该就行了。确保根据文件名调整"Climate_Rad_“和".img”(如果需要,您可能还需要在"Climate_Rad_“之前添加路径,以使其类似于”C:/filefolder/气候_Rad_“)。

票数 6
EN

Stack Overflow用户

发布于 2017-01-22 22:44:16

包有"mixedsort“功能,可以帮助你。

示例答案取自Peter Verbeet myFiles。

代码语言:javascript
复制
myFiles <- paste("Climate_Rad_", c(1:15, 95:110), ".img", sep = "") 

install.packages ('gtools')
require ('gtools')

mixedsort (myFiles)

[1] "Climate_Rad_1.img"   "Climate_Rad_2.img"  
[3] "Climate_Rad_3.img"   "Climate_Rad_4.img"  
[5] "Climate_Rad_5.img"   "Climate_Rad_6.img"  
[7] "Climate_Rad_7.img"   "Climate_Rad_8.img"  
[9] "Climate_Rad_9.img"   "Climate_Rad_10.img" 
[11] "Climate_Rad_11.img"  "Climate_Rad_12.img" 
[13] "Climate_Rad_13.img"  "Climate_Rad_14.img" 
[15] "Climate_Rad_15.img"  "Climate_Rad_95.img" 
[17] "Climate_Rad_96.img"  "Climate_Rad_97.img" 
[19] "Climate_Rad_98.img"  "Climate_Rad_99.img" 
[21] "Climate_Rad_100.img" "Climate_Rad_101.img"
[23] "Climate_Rad_102.img" "Climate_Rad_103.img"
[25] "Climate_Rad_104.img" "Climate_Rad_105.img"
[27] "Climate_Rad_106.img" "Climate_Rad_107.img"
[29] "Climate_Rad_108.img" "Climate_Rad_109.img"
[31] "Climate_Rad_110.img"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10777367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档