使用strsplit()函数在两个字符之间拆分字符串

7

假设我有以下字符串:

s <- "ID=MIMAT0027618;Alias=MIMAT0027618;Name=hsa-miR-6859-5p;Derives_from=MI0022705"

我想要恢复在";""="之间的字符串,以获得以下输出:
[1] "MIMAT0027618"  "MIMAT0027618"  "hsa-miR-6859-5p"  "MI0022705"

我能用strsplit()函数来分割多个元素吗?

2个回答

17

1) 对矩阵进行strsplit操作 尝试使用以下代码:

> matrix(strsplit(s, "[;=]")[[1]], 2)[2,]
[1] "MIMAT0027618"    "MIMAT0027618"    "hsa-miR-6859-5p" "MI0022705"   

2) 使用 gsub 的 strsplit 或者此处使用 strsplitgsub 的方法:

> strsplit(gsub("[^=;]+=", "", s), ";")[[1]]
[1] "MIMAT0027618"    "MIMAT0027618"    "hsa-miR-6859-5p" "MI0022705"     

3) strsplit with sub 或者使用 strsplitsub 的这种用法:

> sub(".*=", "", strsplit(s, ";")[[1]])
[1] "MIMAT0027618"    "MIMAT0027618"    "hsa-miR-6859-5p" "MI0022705"   

4) strapplyc 或者这个函数,它会在等号后面提取连续的非分号字符串:

> library(gsubfn)
> strapplyc(s, "=([^;]+)", simplify = unlist)
[1] "MIMAT0027618"    "MIMAT0027618"    "hsa-miR-6859-5p" "MI0022705"  

新增了更多的strplit解决方案。


很酷 - 基于这个,我找到了一种方法来提取数据框列中每行的拆分hsa-miR-something 的第三个元素,使用以下方法:unlist(apply(B, MARGIN=1, FUN=function(x) matrix(strsplit(x[column number], "[;=]")[[1]], 2)[2,][3])) - biohazard
请注意,您评论中的代码简化为 matrix(strsplit(s, "[;=]")[[1]], 2)[2, 3] - G. Grothendieck

3

我知道这是一个老问题,但我发现使用环视正则表达式来解决这个问题非常优雅:

library(stringr)
your_string <- '/this/file/name.txt'
result <- str_extract(string = your_string, pattern = "(?<=/)[^/]*(?=\\.)")
result

简而言之,

  1. (?<=...) 部分在目标字符串之前查找 ...(在本例中为正斜杆)。
  2. [^/]* 然后查找连续的许多字符,这些字符不是正斜杆(在本例中为 name.txt)。
  3. (?=...) 部分在目标字符串之后查找 ...(在本例中为特殊的句点字符,需要转义为 \\.)。

这个方法也适用于数据框:

library(dplyr)
strings <- c('/this/file/name1.txt', 'tis/other/file/name2.csv')
df <- as.data.frame(strings) %>% 
  mutate(name = str_extract(string = strings, pattern = "(?<=/)[^/]*(?=\\.)"))
# Optional
names <- df %>% pull(name)

或者说,在你的情况下:

your_string <- "ID=MIMAT0027618;Alias=MIMAT0027618;Name=hsa-miR-6859-5p;Derives_from=MI0022705" 
result <- str_extract(string = your_string, pattern = "(?<=;Alias=)[^;]*(?=;)") 
result # Outputs 'MIMAT0027618'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接