You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:00:39