2017-08-30 88 views
2

我有一个向量的文件名,我想提取部分名称。矢量是:提取部分字符串R

vect <- c("Z:/zoe/test2/H1.fusion.txt", "Z:/zoe/test2/H1_1.fusion.txt", 
"Z:/zoe/test2/H2.fusion.txt", "Z:/zoe/test2/H3.fusion.txt", 
"Z:/zoe/test2/H4.fusion.txt", "Z:/zoe/test2/H5.fusion.txt") 

我想通过矢量循环,并提取了名的H一部分,所以在第三/和第一.
理想之间我不想算量子字符的字符作为目录名称和文件名称将会改变。
另外由于有多个/.,我不能使用s.indexOf
这可能吗?

回答

1
gsub("(^/)|(\\.$)", "", regmatches(vect, regexpr("/([^\\.|/)])+\\.", vect))) 
4

正则表达式对于这种简单的文本提取任务非常有用。在这种情况下,这个想法首先匹配可能的最长字符串,该字符串仍然是斜线,一些非周期字符,一段时间,然后是任何东西。然后,返回当我们用上面确定的非周期部分替换所有描述时发生的情况。

gsub(".*/([^.]+)\\..*", "\\1", vect) 
5

您可以使用pathological包,然后去:

library(pathological) 
vect 

# [1] "Z:/zoe/test2/H1.fusion.txt" "Z:/zoe/test2/H1_1.fusion.txt" 
# [3] "Z:/zoe/test2/H2.fusion.txt" "Z:/zoe/test2/H3.fusion.txt" 
# [5] "Z:/zoe/test2/H4.fusion.txt" "Z:/zoe/test2/H5.fusion.txt" 

decompose_path(vect)$filename 
# [1] "H1" "H1_1" "H2" "H3" "H4" "H5" 

我认为这是你想要的。

它具有在不同系统上正确处理文件路径的优势。 decompose_path轻易扒路成几部分:

> decompose_path(vect) 
            dirname filename extension 
Z:/zoe/test2/H1.fusion.txt Z:/zoe/test2  H1 fusion.txt 
Z:/zoe/test2/H1_1.fusion.txt Z:/zoe/test2  H1_1 fusion.txt 
Z:/zoe/test2/H2.fusion.txt Z:/zoe/test2  H2 fusion.txt 
Z:/zoe/test2/H3.fusion.txt Z:/zoe/test2  H3 fusion.txt 
Z:/zoe/test2/H4.fusion.txt Z:/zoe/test2  H4 fusion.txt 
Z:/zoe/test2/H5.fusion.txt Z:/zoe/test2  H5 fusion.txt 

,它也将工作,如果你的路径是用反斜杠,这也是Windows系统中有效分离器分离。

> v2 
[1] "Z:\\zoe\\test2\\H1.fusion.txt" "Z:\\zoe\\test2\\H1_1.fusion.txt" 
[3] "Z:\\zoe\\test2\\H2.fusion.txt" "Z:\\zoe\\test2\\H3.fusion.txt" 
[5] "Z:\\zoe\\test2\\H4.fusion.txt" "Z:\\zoe\\test2\\H5.fusion.txt" 
> decompose_path(v2)$filename 
[1] "H1" "H1_1" "H2" "H3" "H4" "H5" 
> 

如果你有路径,尽量像对待路径,而不是一般的字符串 - 的pathological包是一个很大的帮助,值得一用。

+0

有趣! :-) –

0

tidyverse解决方案:

library(stringr) 
str_extract(vec, "[H0-9_]+.[a-z]+") 
[1] "H1.fusion" "H1_1.fusion" "H2.fusion" "H3.fusion" "H4.fusion" "H5.fusion" 

或者,如果你不想让 “融合” 的一部分:

str_extract("[H][0-9_]+") 
[1] "H1" "H1_1" "H2" "H3" "H4" "H5" 
6

您还可以使用basename(无需包装):

# > basename(vect) 
# [1] "H1.fusion.txt" "H1_1.fusion.txt" "H2.fusion.txt" "H3.fusion.txt" 
# [5] "H4.fusion.txt" "H5.fusion.txt" 

gsub("[.].+$", "", basename(vect)) 

# [1] "H1" "H1_1" "H2" "H3" "H4" "H5" 

如果你想知道,dirname()给你的目录名称:

# > dirname(vect) 
# [1] "Z:/zoe/test2" "Z:/zoe/test2" "Z:/zoe/test2" "Z:/zoe/test2" "Z:/zoe/test2" 
# [6] "Z:/zoe/test2"