R语言:筛选数据框中仅由指定字母构成的单词行
错误原因说明
你之前的写法存在两个核心问题:
- 正则逻辑错误:用
|拼接字母的匹配规则是「只要单词包含任意一个指定字母就会命中」,和你需要的「单词所有字符都属于指定字母集合」的要求不符,所以才会返回所有行。 - 变量名冲突:你用了
letters作为自定义变量名,但R内置了常量letters代表全部26个小写字母,容易出现意料之外的问题,建议换用其他变量名。
正确实现方法
实现思路
构造正则规则^[允许字符集]+$,各符号含义:
^匹配字符串开头$匹配字符串结尾- 中括号包裹的字符集匹配范围内的任意单个字符
+要求字符至少出现1次
整套规则的含义就是「从开头到结尾的所有字符都属于指定字符集」。
代码示例
library(tidyverse) # 构造示例数据 df <- data.frame(words = c("acerbe", "malus", "as", "clade", "after", "sel", "moineau") ) # 定义允许的字母集合,避免和内置变量冲突 allowed_letters <- c("a", "z", "e", "r", "q", "s", "d", "f", "w", "x", "c") # 构造匹配正则 pattern <- paste0("^[", paste(allowed_letters, collapse = ""), "]+$") # 筛选符合要求的行 result <- df %>% filter(str_detect(words, pattern))
输出结果
words 1 as
如果需要反向筛选出包含非允许字母的行,仅需给str_detect添加negate = TRUE参数即可。
内容的提问来源于stack exchange,提问作者Ladislas Nalborczyk
相关产品推荐
相关产品推荐

