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
相关产品推荐
相关产品推荐

