R语言data.frame筛选异常:匹配1无结果,匹配-1正常
R语言data.frame筛选异常问题分析
问题现象
对第一个df执行筛选时,f <- df[df[,1] == 1,]返回0行,但f <- df[df[,1] == -1,]能正常得到对应行;而新建的df2执行相同筛选1的操作却成功。
原操作代码
view(df) class(df) .class2(df[[1]]) df f <- df[df[,1] == 1,] f
输出结果
> class(df) [1] "data.frame" > .class2(df[,1]) [1] "double" "numeric" > df cod uncod 1 -0.8333333 0.040 2 -0.8333333 0.040 3 -0.8333333 0.040 4 -0.8333333 0.040 5 -1.0000000 0.038 6 -1.0000000 0.038 7 1.0000000 0.062 8 1.0000000 0.062 9 -0.8333333 0.040 10 -0.8333333 0.040 11 -0.8333333 0.040 > f <- df[df[,1] == 1,] > f [1] cod uncod <0 Zeilen> (oder row.names mit Länge 0)
匹配-1的正常操作
f <- df[df[,1] == -1,] > f cod uncod 5 -1 0.038 6 -1 0.038
新建data.frame的正常操作
df2<-data.frame(cod=c(-0.83,-1,0,1),uncod=c(0.040,0.038,0.05,0.062)) > f2 <- df2[df2[,1] == 1,] > f2 cod uncod 4 1 0.062
问题原因
这是浮点数精度误差导致的:
- 控制台显示的
1.0000000只是格式化后的结果,实际存储的数值是一个非常接近1但不等于1的浮点数(比如1.0000000000001或0.9999999999999),直接用==做精确匹配会失败。 -1是可以被浮点数精确表示的整数,所以== -1能匹配成功;而新建df2中的1是直接赋值的精确值,因此筛选正常。
解决方案
- 用
dplyr包的near()函数做近似匹配:library(dplyr) f <- df[near(df[,1], 1), ] - 设置误差阈值,判断差值是否小于极小值:
f <- df[abs(df[,1] - 1) < 1e-6, ] - 若列值应为整数,直接转换为整数类型后筛选:
df[,1] <- as.integer(df[,1]) f <- df[df[,1] == 1, ]
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

