在R中按特定顺序处理文件

时间:2013-07-08 12:17:09

标签: r filenames

我有几个数据文件,我需要按特定顺序处理。例如,文件名的模式是"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")

但我确信有一种方法可以直接对文件进行排序,而无需重命名所有文件。我尝试使用sort并使用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")

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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

答案 2 :(得分: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)

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

ADDENDUM:

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

mydb$index <- as.numeric(mydb$index)