1

我有几个数据文件,我需要按特定顺序处理它们。文件名称的模式是,例如"Ad_10170_75_79.txt".

目前它们是根据第一个数字(长度不同)排序的,见下文:

f <- as.matrix (list.files())
f
[1] "Ad_10170_75_79.txt" "Ad_10345_76_79.txt" "Ad_1049_25_79.txt"  "Ad_10531_77_79.txt"

但我需要它们按中间数字排序,如下所示:

> f
[1] "Ad_1049_25_79.txt" "Ad_10170_75_79.txt" "Ad_10345_76_79.txt"   "Ad_10531_77_79.txt"

因为我只需要文件名的中间数字,我认为最简单的方法是去掉其余的名称并重命名所有文件。为此,我尝试使用strsplitplyr)。

f2 <- strsplit (f,"_79.txt")

但我确信有一种方法可以直接对文件进行排序,而无需重命名所有文件。我尝试使用sortand 来描述这个名字,regex但没有成功。这个问题已经困扰了很多天,我花了几个小时搜索和尝试,来解决这个可能很容易的任务。很感谢任何形式的帮助。

旧示例数据集:

f <- c("Ad_10170_75_79.txt", "Ad_10345_76_79.txt",
       "Ad_1049_25_79.txt", "Ad_10531_77_79.txt")

谢谢你的回答。我想我必须修改我的示例,因为该解决方案应该适用于所有可能的中间数字,而与它们的数字无关。

新的示例数据集:

f <- c("Ad_10170_75_79.txt", "Ad_10345_76_79.txt",
       "Ad_1049_9_79.txt", "Ad_10531_77_79.txt")
4

3 回答 3

3

这是一种正则表达式方法。

f[order(as.numeric(gsub('Ad_\\d+_(\\d+)_\\d+\\.txt', '\\1', f)))]
# [1] "Ad_1049_9_79.txt"   "Ad_10170_75_79.txt" "Ad_10345_76_79.txt" "Ad_10531_77_79.txt"
于 2013-07-08T12:23:23.493 回答
2

尝试这个:

f[order(as.numeric(unlist(lapply(strsplit(f, "_"), "[[", 3))))]
[1] "Ad_1049_25_79.txt"  "Ad_10170_75_79.txt" "Ad_10345_76_79.txt" "Ad_10531_77_79.txt"

首先我们拆分_,然后选择每个列表元素的第三个元素,f根据该顺序找到顺序和子集。

于 2013-07-08T12:20:52.857 回答
0

我将创建一个包含文件名及其各自提取索引的小数据框:

f<- c("Ad_10170_75_79.txt","Ad_10345_76_79.txt","Ad_1049_25_79.txt","Ad_10531_77_79.txt")
f2 <- strsplit (f,"_79.txt")
mydb <- as.data.frame(cbind(f,substr(f2,start=nchar(f2)-1,nchar(f2))))
names(mydb) <- c("filename","index")
library(plyr)
arrange(mydb,index)

将此的第一列作为您的文件名向量。

附录:

如果需要数字索引,只需将字符转换为数字:

mydb$index <- as.numeric(mydb$index)
于 2013-07-08T12:24:26.343 回答