我有几个数据文件,我需要按特定顺序处理。例如,文件名的模式是"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"
由于我只需要文件名的中间数字,我认为最简单的方法是删除名称的其余部分并重命名所有文件。为此,我尝试使用strsplit
(plyr
)。
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")
答案 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)