【问题标题】:Extract a string between patterns/delimiters in R在R中的模式/分隔符之间提取字符串
【发布时间】:2014-05-06 19:35:26
【问题描述】:

我有以下形式的变量名:

PP_Sample_12.GT

PP_Sample-17.GT

我正在尝试使用字符串拆分来删除中间部分:即Sample_12Sample-17。但是,当我这样做时:

IDtmp <- sapply(strsplit(names(df[c(1:13)]),'_'),function(x) x[2])
IDs <- data.frame(sapply(strsplit(IDtmp,'.GT',fixed=T),function(x) x[1]))

我以Sample 结束PP_Sample_12.GT

还有其他方法可以做到这一点吗?也许使用模式/替换功能?虽然,不确定这是否存在于 R 中(但我认为这可能适用于 gsub

【问题讨论】:

  • 你没有找到错误的原因是你有太多的抽象层。不要试图一次做所有事情,而是努力将PP_Sample-17.GT 变成你想要的,然后概括。

标签: regex r strsplit


【解决方案1】:

使用此输入:

x <- c("PP_Sample_12.GT", "PP_Sample-17.GT")

1) strsplit。将第一个下划线替换为点,然后按点分割:

spl <- strsplit(sub("_", ".", x), ".", fixed = TRUE)
sapply(spl, "[", 2)

2) gsub 将前缀(^[^_]*_)和后缀(\\.[^.]*$")替换为空字符串:

gsub("^[^_]*_|\\.[^.]*$", "", x)

3) gsubfn::strapplyc 提取下划线和点之间的所有内容。

library(gsubfn)
strapplyc(x, "_(.*)\\.", simplify = TRUE)

【讨论】:

    【解决方案2】:

    这是一个gsub,它将提取第一个_之后和最后一个.之前的所有内容

    x<-c("PP_Sample-12.GT","PP_Sample-17.GT")
    gsub(".*_(.*)\\..*","\\1", x, perl=T)
    

    【讨论】:

      【解决方案3】:

      如果它们都以相同的字符开头和结尾,并且这些字符不在字符串的中间部分,gsub 表达式很简单:

      > x <- c("PP_Sample-12.GT","PP_Sample-17.GT")
      > gsub('[(PP_)|(.GT)]','',x)
      [1] "Sample-12" "Sample-17
      

      【讨论】:

        【解决方案4】:

        这会抓取列表中被拆分的每个部分的2nd 元素,然后通过子集函数[ 将其简化为向量,使用sapply 为原始列表的每个元素调用此函数。

        x <- c('PP_Sample_12.GT', 'PP_Sample-17.GT')
        sapply(strsplit(x, '(?:_(?=\\D)|\\.GT)', perl = T), '[', 2)
        
        [1] "Sample_12" "Sample-17"
        

        【讨论】:

          猜你喜欢
          • 2018-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-01
          • 2012-08-18
          • 2023-03-10
          • 1970-01-01
          • 2020-05-08
          相关资源
          最近更新 更多