R语言:用字符串匹配筛选含.50的mtcars行失败,求解决方案
嘿,这个坑我踩过好多次!你遇到的问题核心是正则表达式里的特殊字符没处理——.在正则语法里是匹配任意单个字符的通配符,不是字面意义上的小数点。所以你写的.50其实是在找「任意字符+50」的组合,而不是你想要的「.50」这个具体字符串,自然匹配不到14.50、15.50这些值啦。
下面给你几个靠谱的解决方案:
方案1:直接按纯文本匹配(最简单)
告诉匹配函数把目标字符串当作普通文本,不要解析成正则规则,用fixed()参数就行:
# dplyr + stringr 写法 mtcars_stringed <- mtcars %>% filter(str_detect(qsec, fixed(".50"))) # base R 的 grep 写法 mtcars_stringed <- mtcars[grep(".50", mtcars$qsec, fixed = TRUE), ]
要是想用%like%的话,同样可以加fixed():
mtcars_stringed <- mtcars[mtcars$qsec %like% fixed(".50"), ]
方案2:转义正则里的小数点
如果之后需要扩展正则规则(比如匹配更多格式),就得把.转义成\\.(R里需要双重转义才能表示字面的点):
# dplyr + stringr 写法 mtcars_stringed <- mtcars %>% filter(str_detect(qsec, "\\.50")) # base R 的 grep 写法 mtcars_stringed <- mtcars[grep("\\.50", mtcars$qsec), ]
方案3:直接用数值比较(最稳妥)
其实qsec是数值型变量,完全没必要转成字符串匹配。直接判断它的小数部分是不是0.50,还能避免字符串匹配的各种意外:
# 提取小数部分判断 mtcars_stringed <- mtcars %>% filter(qsec - floor(qsec) == 0.5) # 怕浮点精度问题的话,用round处理 mtcars_stringed <- mtcars %>% filter(round(qsec - floor(qsec), 2) == 0.5)
试试上面的方法,应该就能拿到你想要的那些行啦!
内容的提问来源于stack exchange,提问作者Krantz
相关产品推荐
相关产品推荐

