【问题标题】:R: splitting a string between two characters using strsplit()R:使用 strsplit() 在两个字符之间拆分字符串
【发布时间】:2014-02-09 14:06:14
【问题描述】:

假设我有以下字符串:

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

我想恢复";""=" 之间的字符串以获得以下输出:

[1] "MIMAT0027618"  "MIMAT0027618"  "hsa-miR-6859-5p"  "MI0022705"

我可以将strsplit() 与多个拆分元素一起使用吗?

【问题讨论】:

    标签: r split strsplit


    【解决方案1】:

    1) strsplit with matrix试试这个:

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

    2) strsplit 与 gsubstrsplitgsub 的使用:

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

    3) strsplit 与 substrsplitsub 的使用:

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

    4) strapplyc 或 this 在等号后提取连续的非分号:

    > 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]))
    • 请注意,您评论中的代码简化为matrix(strsplit(s, "[;=]")[[1]], 2)[2, 3]
    【解决方案2】:

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

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

    一句话,

    1. (?&lt;=...) 部分看起来 之前是 a... 的所需字符串(在本例中为正斜杠)。
    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'
    

    【讨论】:

      猜你喜欢
      • 2023-04-09
      • 2022-06-15
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多