r语言 - 选择具有部分匹配的行,其中列的字符串不适用于小数



例如,如果我只想保留变量qsec包含此小数.50mtcars的数据行,请按照此处给出的解决方案,我使用:

mtcars_stringed<-mtcars%>%filter(str_detect(qsec, ".50"))
mtcars_stringed<-mtcars[mtcars$qsec %like% ".50", ]
mtcars_stringed <- mtcars[grep(".50", mtcars$qsec), ]
View(mtcars_stringed)

令人惊讶的是,所有这些策略都失败了,返回 null,而实际上mtcars$qsec的值包含.50,例如14.50, 15.50,

有什么替代解决方案,还是我缺少什么?提前谢谢。

当您将数字视为字符串时,它会转换为as.character(mtcars$qsec).如果你看一下,你会看到在转换中,尾随的 0 被丢弃了,所以我们得到,例如,"14.5", "15.5".

如果您使用正则表达式模式"\.5$",它将起作用,\使.成为.,而不仅仅是"任何字符",并且$匹配字符串的末尾。

mtcars %>% filter(str_detect(qsec, "\.5$"))
#    mpg cyl disp  hp drat   wt qsec vs am gear carb
# 1 15.8   8  351 264 4.22 3.17 14.5  0  1    5    4
# 2 19.7   6  145 175 3.62 2.77 15.5  0  1    5    6

但是,通常,将小数视为字符串可能会有风险。更好的方法可能是用%% 1去掉整数,然后在某个容差范围内测试接近0.5,这将避免精度问题。

mtcars %>% filter(abs(qsec %% 1 - 0.5) < 1e-10)

您可能正在寻找:

mtcars %>%
filter(qsec %% 0.50 == 0 & qsec %% 1 != 0)
mpg cyl disp  hp drat   wt qsec vs am gear carb
1 15.8   8  351 264 4.22 3.17 14.5  0  1    5    4
2 19.7   6  145 175 3.62 2.77 15.5  0  1    5    6

最新更新