【问题标题】:How do I delete a row with a pattern in R?如何在 R 中删除带有模式的行?
【发布时间】:2021-04-16 11:59:45
【问题描述】:

我有一个数据框,我想在其中删除具有特定模式的所有行。我对编译正则表达式感到困惑。

数据:

structure(list(id = 1:5, email = c("1@gmail.com", "2@gmail.com", 
"3@gmail.com", "4@pattern.com", "5@pattern.com")), class = "data.frame", row.names = c(NA, 
-5L))

我想做的是:

data <- data %>%
  filter(email != ".+@pattern.com")

但是我的正则表达式有问题。为此类模式编写正则表达式的最有效方法是什么?我的示例案例的正确正则表达式模式是什么?

【问题讨论】:

    标签: r filter grepl


    【解决方案1】:

    这使用grepl 执行正则表达式比较

    libary(dplyr)
    
    data %>%
      filter(!grepl("@pattern.com$", email))
    
      id       email
    1  1 1@gmail.com
    2  2 2@gmail.com
    3  3 3@gmail.com
    

    【讨论】:

    • 很好,谢谢!你知道如何为这种情况编写通用正则表达式吗?
    • @k1rgas 您能否提供有关您正在寻找的内容的更多信息?您在寻找多种模式吗?
    • 我的意思是没有grepl但使用正则表达式的解决方案
    • @k1rgas 花一些时间阅读?grepl,因为第一个参数是正则表达式。这通过将正则表达式模式传递给grepl 来工作,这会创建一个逻辑向量,filter 使用它来返回所需的结果。上面的例子使用了$,它是行尾的正则表达式。
    【解决方案2】:

    base R 中,您可以删除which 中的行,@pattern.com 模式由grepl 函数在email 列中检测到:

    data[-which(grepl("@pattern.com", data$email)),]
      id       email
    1  1 1@gmail.com
    2  2 2@gmail.com
    3  3 3@gmail.com
    

    数据:

    data <- structure(list(id = 1:5, email = c("1@gmail.com", "2@gmail.com", 
                                               "3@gmail.com", "4@pattern.com", "5@pattern.com")), class = "data.frame", row.names = c(NA, 
    

    【讨论】:

    • 也可以使用data[!grepl("@pattern.com$", data$email), ]来否定模式
    猜你喜欢
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 2013-11-25
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多