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

Extract the last word between | |

我有以下数据集

> 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, "|.*?|")
^.*\|\K.*?(?=\|)

使用 \K 从最后 matche.See 中删除其余部分 demo.Also 使用 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"

我们可以使用

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

数据

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

仅使用基础 R:

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

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

根据@RichardScriven 的说法:

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

在这种情况下,您也可以使用包 "stringr"。这是代码:

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

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

word(v1,-2)

这里我用了v作为字符串。基本理论是将所有的|替换为空格,然后使用函数word().

得到字符串中的最后一个单词