美文网首页R优质资源
讨论学习R的grepl函数,附代码

讨论学习R的grepl函数,附代码

作者: 生信交流平台 | 来源:发表于2021-02-19 22:00 被阅读0次

俗话说,“独学而无友,则孤陋而寡闻”。

为了方便大家交流学习,共同进步,我特地创建了☞生信交流群

废话不多说,我们来聊聊今天的正题。昨天有位群友在群里提出了这样一个问题

具体的字符串向量是这样的,需要达到的目的就是,看字符串向量里面的每一个元素是否包含"LIPE2"这个基因。这里的字符串向量有四个元素。

实现的手段就是通过R的grepl函数

这个函数里的pattern是匹配的模式,也就是我们经常听到的正则表达式。如果对正则表达式还不了解的小伙伴,可以参考☞正则表达式☜。x就是要查看是否满足pattern的字符串向量,如果匹配pattern就返回TRUE,不满足就返回FASLE。

这位群友所提出的问题,tricky的地方在于LIPE2这个基因有时候存在于字符串的中间,有时候存在于开头,有时候又存在于末尾,并且还需要考虑一些干扰项比如LIPE23这个基因也能够匹配LIPE2,似乎很难通过一个正则表达式来实现。后来这位群友自己解决了这个问题,方法就是通过或来实现。既然一个正则表达式无法满足需要,那就多写几个正则表达式,把所有可能的情况都考虑进去。

这个问题引起了群里关于正则表达式激烈的讨论,

其实,在这个群友提出这个问题之前,我还不太确定,pattern里面可以使用或(|),通过讨论大家都有所收获,至少群里的其他小伙伴知道了正则表达式这个概念。以后遇到相似的问题,也知道怎么解决了。

今天我又仔细的研究了一下,给出了三种实现的方法,供大家交流学习。我又加入了一个干扰项,让这个正则表达式更全面。

s <- c("ABCLIPE2", #LIPE2前面有干扰
       "LIPE-AS1,LIPE,CXCL17",
       "LIPE-AS1,LIPE2,LIPE,CXCL17", #LIPE2在中间,前后都有,
       "LIPE2",  #LIPE2在字符串的开始,或者结尾
       "LIPE23")  #LIPE2后面有干扰

方法一,直接匹配所有可能的情况

#^LIPE2$:匹配整个字符串只有LIPE2这个基因,^锚定开始,$锚定结尾
#,LIPE2,:匹配LIPE2在中间,前后都有其他基因
#^LIPE2,:匹配LIPE2在开始,后面有基因
#,LIPE2$:匹配LIPE2在结尾,前面有基因
#|是或,即满足其中任何一个条件即可
grepl("^LIPE2$|,LIPE2,|^LIPE2,|,LIPE2$",s)
#[1] FALSE FALSE  TRUE  TRUE FALSE

方法二,利用\b,单词边界

#\b匹配一个单词边界,也就是指单词和空格间的位置。
#例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
grepl("\\bLIPE2\\b",s)
#[1] FALSE FALSE  TRUE  TRUE FALSE

方法三,利用strsplit和%in%

sapply(s,function(x){
  'LIPE2' %in% strsplit(x,',')[[1]]
})

返回的结果是

如果对strsplit还不熟悉的小伙伴,其实可以先输出来看看结果

sapply(s,function(x){
  strsplit(x,',')[[1]]
})

返回的结果是分割之后的字符串向量

参考资料:

  1. 正则表达式
  2. https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/strsplit
  3. https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/grep

相关文章

  • 讨论学习R的grepl函数,附代码

    俗话说,“独学而无友,则孤陋而寡闻”。 为了方便大家交流学习,共同进步,我特地创建了☞生信交流群[https://...

  • 《Learning R》笔记 Chapter 13 Clean

    数据清洗是数据分析中最为繁杂头疼的部分。 字符串清洗 R自带函数 grep,grepl和regexpr是R自带的三...

  • R中的grep和grepl函数

    在日常数据分析的过程中,我们经常需要在一个字符串或者字符串向量中查找是否包含我们要找的东西,或者向量中那几个元素包...

  • R_字符串替换函数(正则)

    常用函数 grep、 grepl、regexpr、gregexpr and regexec sub、gsub。 参...

  • 欧阳老师网页教程笔记(2)

    正则表达式 几个函数:grep, grepl, sub, gsub, regexpr, gregrexpr, re...

  • Day6R包学习-谢大飞

    学习R包 包是 R 函数、实例数据、预编译代码的集合,包括 R 程序,注释文档、实例、测试数据等。R 语言相关的包...

  • 20190506-R语言字符处理函数※grep、grepl

    ※ grep Usagegrep(pattern, x, ignore.case = FALSE, perl = ...

  • 06-初识函数

    一、函数 1.函数概述 1.1认识函数 需求:求圆的面积 s = π * r ** 2 代码演示: 问题:代码重复...

  • Swift 之函数

    代码实现 函数的定义 函数的定义 格式 func 函数名(行参列表) -> 返回值 {代码实现} 调用 let r...

  • 学习小组Day6----七七七七

    学习R包 R包:一个丰富的东西,有函数,有教程,有举例。 一、镜像设置 编辑Rprofiles,加入两行代码,分别...

网友评论

    本文标题:讨论学习R的grepl函数,附代码

    本文链接:https://www.haomeiwen.com/subject/kljzxltx.html