2017-08-30 164 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"