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