2013-07-08 28 views
1

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

目前他们正在根据第一号(长度不同)进行分类,见下图:

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

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

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" 
+0

@ May6更新。你可以通过用'as.numeric'包装'gsub'调用来解决这个问题。 –

+0

谢谢你的工作!你知道一个用于假人的正则表达式教程吗?我找不到对我来说足够详细的。 – May6

+0

如果R是您选择的语言,我推荐'?regex'。 –

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订购。

+0

感谢你的努力!我编辑了我的问题,因为代码正常,如果中间的数字长度相同。新示例无法正常工作,顺序为:75,76,77,9。对不起,我以前没有想过这个。 – May6

+0

@ May6如果你的字符串是'AD_number_number_number.txt',这种方法应该可以工作。它会在'_'上分割出第三个字。 –

+0

我的字符串如你所说。如果你在代码中添加'as.numeric',这个解决方案就行得通:f [order(as.numeric(unlist(lapply(strsplit(f,“_”),“[[”,3))))] – May6

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) 
+0

感谢您的努力。您的解决方案适用于第一个示例,但不适用于第二个示例数据集。它不会将数字识别为数字,因此排序是错误的。我试图解决这个问题,但没有成功。因为我需要在后面的步骤中编制索引,无论如何,我会非常感兴趣地选择合适的工作解决方案。 – May6

+0

@ May6这很容易实现,请参阅附录。 –