提取字符串R

时间:2017-08-30 22:04:19

标签: 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
这可能吗?

5 个答案:

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

答案 1 :(得分: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包是一个很大的帮助,值得使用。

答案 2 :(得分:4)

正则表达式对于这种简单的文本提取任务非常有用。在这种情况下,想法首先匹配可能仍然跟着斜杠的一长串字符串,一些非句点字符,句点,然后是任何东西。然后,返回当我们用上面标识的非周期部分替换所描述的所有内容时发生的事情。

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

答案 3 :(得分:1)

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

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