提取|之间的最后一个字|

时间:2015-12-17 19:08:33

标签: regex r stringr

我有以下数据集

> head(names$SAMPLE_ID)
[1] "Bacteria|Proteobacteria|Gammaproteobacteria|Pseudomonadales|Moraxellaceae|Acinetobacter|"
[2] "Bacteria|Firmicutes|Bacilli|Bacillales|Bacillaceae|Bacillus|"                            
[3] "Bacteria|Proteobacteria|Gammaproteobacteria|Pasteurellales|Pasteurellaceae|Haemophilus|" 
[4] "Bacteria|Firmicutes|Bacilli|Lactobacillales|Streptococcaceae|Streptococcus|"             
[5] "Bacteria|Firmicutes|Bacilli|Lactobacillales|Streptococcaceae|Streptococcus|"             
[6] "Bacteria|Firmicutes|Bacilli|Lactobacillales|Streptococcaceae|Streptococcus|" 

我想提取||之间的最后一个字作为新变量,即

Acinetobacter
Bacillus
Haemophilus

我尝试过使用

library(stringr)
names$sample2 <-   str_match(names$SAMPLE_ID, "|.*?|")

5 个答案:

答案 0 :(得分:5)

仅使用基础R:

myvar <- gsub("^..*\\|(\\w+)\\|$", "\\1", names$SAMPLE_ID)

答案 1 :(得分:4)

我们可以使用

library(stringi)
stri_extract_last_regex(v1, '\\w+')
#[1] "Acinetobacter"

数据

v1 <- "Bacteria|Proteobacteria|Gammaproteobacteria|Pseudomonadales|Moraxellaceae|Acinetobacter|"

答案 2 :(得分:3)

^.*\\|\\K.*?(?=\\|)

使用\K从最终的matche中移除休息。参见演示。另外使用perl=T

https://regex101.com/r/fM9lY3/45

x <- c("Bacteria|Firmicutes|Bacilli|Lactobacillales|Streptococcaceae|Streptococcus|",
       "Bacteria|Firmicutes|Bacilli|Lactobacillales|Streptococcaceae|Streptococcus|" )

unlist(regmatches(x, gregexpr('^.*\\|\\K.*?(?=\\|)', x, perl = TRUE)))
# [1] "Streptococcus" "Streptococcus"

答案 3 :(得分:3)

结局就是你所需要的[^|]+(?=\|$)

Per @RichardScriven:

Which in R would be regmatches(x, regexpr("[^|]+(?=\\|$)", x, perl = TRUE)

答案 4 :(得分:1)

你可以使用package&#34; stringr&#34;在这种情况下也是如此。这是代码:

v<- "Bacteria| Proteobacteria|Gammaproteobacteria|Pseudomonadales|Moraxellaceae|Acinetobacter|"

v1<- str_replace_all(v, "\\|", " ")

word(v1,-2)

这里我用v作为字符串。基本理论是用空格替换所有|,然后使用函数word()获取字符串中的最后一个单词。