You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言如何按不区分大小写的子串匹配删除data frame行

R语言删除包含指定不区分大小写子串的行

你可以通过正则匹配函数grepl()实现需求,该函数返回布尔类型的逻辑向量,适配基础R、dplyr、data.table所有常见的数据操作语法,核心是开启ignore.case = TRUE参数实现不区分大小写匹配。

首先构造示例测试数据:

# 示例数据集
df <- data.frame(
  FirstName = c("Alexsmith", "ThegreatAlex", "AlexBobJones1", "Bobsmiles222", "Christopher", "Christofer"),
  Letter = c("A1", "A6", "A7", "A1", "A9", "A6")
)

不同语法场景的实现代码

  • 基础R写法
    推荐优先用grepl()而非grep()做筛选:grepl直接返回等长逻辑值,没有匹配项时也不会出现索引报错,鲁棒性更好。

    # 保留FirstName列任意位置不包含Alex(任意大小写变体)的行
    res_base <- df[!grepl("Alex", df$FirstName, ignore.case = TRUE), ]
    

    如果一定要用grep(),可以通过返回的匹配位置索引反向筛选,但无匹配项时会报错,不推荐:

    res_grep <- df[-grep("Alex", df$FirstName, ignore.case = TRUE), ]
    
  • dplyr写法
    在filter()中直接调用grepl()即可,不需要额外做类型适配:

    library(dplyr)
    res_dplyr <- df %>%
      filter(!grepl("Alex", FirstName, ignore.case = TRUE))
    

    之前遇到报错是因为把整个数据表对象传给了grep(),grep仅接收原子向量作为输入,只要传入对应列的向量就能正常运行。

  • data.table写法
    data.table环境下可以直接调用grepl()做行筛选,也可以用内置的%like%操作符提升性能:

    library(data.table)
    dt <- as.data.table(df)
    # 写法1:直接用grepl
    res_dt1 <- dt[!grepl("Alex", FirstName, ignore.case = TRUE)]
    # 写法2:统一转小写后匹配,性能更高
    res_dt2 <- dt[!tolower(FirstName) %like% "alex"]
    

以上三种写法运行后,都会正确删除所有FirstName含Alex(不区分大小写)的行,最终保留Bobsmiles222、Christopher、Christofer三条记录。


内容的提问来源于stack exchange,提问作者user7264

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 10:30:45