R语言中为何==匹配[Mm]正则表达式无效?如何筛选m/M值观测?
问题解答:为什么
== "[Mm]"无法匹配"m"或"M"? 问题背景
我有一个名为USstorms的数据框,包含902297条观测。执行table(USstorms$CROPDMGEXP)返回结果如下:
? 0 2 B k K m M 618413 7 19 1 9 21 281832 1 1994
尝试筛选出CROPDMGEXP值为"m"或"M"的观测时,使用USstorms[USstorms$CROPDMGEXP=="[Mm]",]无效,执行count(USstorms[USstorms$CROPDMGEXP=="[Mm]",])返回0;但使用USstorms[grep("[Mm]",USstorms$CROPDMGEXP),]能正常返回1995条目标观测,请问前者的正则表达式匹配方式为何无效?
核心原因
==是R中的精确相等运算符,它不支持正则表达式解析:
- 当你写
USstorms$CROPDMGEXP == "[Mm]"时,R会将"[Mm]"视为一个普通的字符串,只会匹配数据框中**完全等于"[Mm]"**的行。但你的数据里没有任何一行的CROPDMGEXP值是"[Mm]",因此返回的逻辑向量全为FALSE,筛选后自然得到0条结果。 - 而
grep()是专门用于正则匹配的函数,它会将"[Mm]"解析为正则规则:匹配单个小写m或大写M字符,因此能正确命中所有值为"m"或"M"的观测。
替代可行写法
除了grep(),还有两种更直观的实现方式:
- 用
%in%做精确多值匹配(无需正则):USstorms[USstorms$CROPDMGEXP %in% c("m", "M"),] - 用
stringr包的str_detect()(现代化正则匹配工具):library(stringr) USstorms[str_detect(USstorms$CROPDMGEXP, "[Mm]"),]
内容的提问来源于stack exchange,提问作者Phong Trang
相关产品推荐
相关产品推荐

