为何case_when语句中第二条代码返回NA?求技术解答
为什么第二条case_when语句返回NA?
这是浮点数精度问题导致的:
- 计算机用二进制存储浮点数,像0.1这类十进制小数无法被二进制精确表示,属于无限循环的二进制小数。
- 计算
as.numeric("82")*0.1时,实际得到的是一个接近8.2但存在微小偏差的数值(用高精度打印可验证:print(as.numeric("82")*0.1, digits=20)会输出8.1999999999999992895)。 - 这个偏差让
==的严格比较不成立,而case_when在所有条件都不满足时,默认返回NA。
解决方法
可以用以下方式规避该问题:
- 使用
dplyr::near()函数(专门用于浮点数近似比较):
case_when(near(as.numeric("82")*0.1, 8.2) ~ TRUE)
- 转换为整数运算,避开浮点数误差:
case_when(as.numeric("82") == 8.2 * 10 ~ TRUE)
- 设置精度阈值进行模糊比较:
case_when(abs(as.numeric("82")*0.1 - 8.2) < 1e-10 ~ TRUE)
内容的提问来源于stack exchange,提问作者Tomas Bro
相关产品推荐
相关产品推荐

