【问题标题】:filter/subset/delete rows that contain character in middle of string in R过滤/子集/删除包含R中字符串中间字符的行
【发布时间】:2018-09-30 16:54:47
【问题描述】:

我有一个数据框,其中有一列包含肽序列,我只想保留字符串中没有内部“R”或“K”的行。

df1 <- data.frame(
    Peptide = c("ABCOIIJUHFSAUJHR", "AOFIAUKOAISDFUK", 'ASOIRDFHAOHFKK'))


df1 #check output

作为输出,我只想保留第一行(即“ABCOIIJUHFSAUJHR”)。

我尝试过使用 stringr 包和长度中的 filter (dplyr) 和 str_locate_all,但无法弄清楚。

任何帮助将不胜感激。

谢谢 萌

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以跳过第一个和最后一个字符 (^., .$) 并匹配 grep 中的零个或多个不是 R 或 K ([^RK]*) 的字符,并使用它来子集数据集

    df1[grepl("^.[^RK]*.$", df1$Peptide), , drop = FALSE]
    #           Peptide
    #1 ABCOIIJUHFSAUJHR
    

    【讨论】:

    • 边缘情况:单字符串:grepl("^.[^RK]*.$", "A")
    • @Frank 很好。我认为我们必须为那些边缘情况创建一个|
    • "^[^R|K]*.$" 是我最终使用的(我删除了.(句号),因为我意识到我实际上也想在一开始过滤掉 K|R。
    【解决方案2】:

    这是dplyr 的解决方案:str_locate 是 tidyverse 等价于 grepl,所以代码如下所示:

    df2 <- df1 %>%
      filter(Peptide %>% str_detect("^.[^RK]*.$"))
    

    【讨论】:

    • 谢谢!我最终使用了dplyr::filter(Peptide %&gt;% str_detect("^[^R|K]*.$"))(因为我还想过滤掉字符串开头的 R|K(见我上面的评论)。
    • 我自己对胰蛋白酶有一些了解,我认为这就是您想要的,但是当我一开始没有包含^. 时,它接受了所有 3 种肽。很高兴你成功了!
    猜你喜欢
    • 2017-02-23
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 2014-04-10
    相关资源
    最近更新 更多