【问题标题】:pattern matching in R using grepl使用 grepl 在 R 中进行模式匹配
【发布时间】:2015-05-21 17:56:35
【问题描述】:

我有一个这样的数据框dat

P pedigree cas 1 M rs2745406 T 2 M rs6939431 A 3 M SNP_DPB1_33156641 G 4 M SNP_DPB1_33156664_G P 5 M SNP_DPB1_33156664_A A 6 M SNP_DPB1_33156664_T A

我想排除 pedigree 列以 SNP_ 开头并以 G、C、T 或 A (_[GCTA]) 结尾的所有行。在这种情况下,这将是第 4、5、6 行。

如何在 R 中实现这一点?我试过了

multisnp <- which(grepl("^SNP_*_[GCTA]$", dat$pedigree)=="TRUE")

new_dat <- dat[-multisnp,]

我的multisnp 向量是空的,但我不知道如何修复它以匹配我想要的模式。我认为这是我的通配符 * 用法错误。

【问题讨论】:

  • 这应该可以完成工作:dat2 <- dat[!grepl("^SNP_\\.*_[GCAT]$", dat$pedigree), perl = T]

标签: regex r grepl


【解决方案1】:

您可以将以下内容与.*? 一起使用(以非贪婪方式匹配所有内容):

multisnp <- which(grepl("^SNP_.*?_[GCTA]$", dat$pedigree))
                              ^^^

【讨论】:

  • 这行得通!你能解释一下.*? 是什么意思吗?我知道* 意味着匹配前面的东西零次或多次,但我不确定这个组合意味着什么。
  • . 表示任何字符.. * 表示如您所知.. 匹配 0 次或多次.. 和 *? 表示以非贪婪方式匹配 0 次或多次.. @987654329 @ 默认情况下是贪婪的,它会匹配之后的所有内容,有时会忽略匹配.* 之后的模式。希望这会有所帮助.. :)
  • 我觉得这里涉及到一个额外的密切括号,它也存在于 OP 的代码中。
  • 我认为这是正则表达式之后的紧接括号。
  • 它不是固定的。 edit 你去。尽管将which== TRUE 一起使用没有用。
【解决方案2】:

你可以像这样子集dat

new_dat <- dat[!grepl("^SNP_.*_[GCTA]$", dat$pedigree), ]

关于您尝试过的代码,我不确定grepl("^SNP_*_[GCTA]$") 是否会在没有错误的情况下完成,因为您没有将x 向量传递给grepl。请参阅?grepl 了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2011-09-25
    • 1970-01-01
    • 2013-03-16
    相关资源
    最近更新 更多