R语言unique函数处理实数去重失效,求解决方法
解决R中
unique()对实数行去重失效的问题 问题根源
看起来完全相同的行,实际是浮点数精度误差导致的:R在控制台显示时会截断小数位数,但底层存储的二进制数值存在极微小的差异,而unique()是严格的精确匹配,因此无法识别这些“视觉上重复”的行。
实用解决方案
方法1:先对数值取整到指定小数位,再去重
根据数据的精度需求,先把列值四舍五入到足够多的小数位(比如保留6位),再调用unique():
# 对x、y列四舍五入保留6位小数 con.hull.mod[, c("x", "y")] <- round(con.hull.mod[, c("x", "y")], 6) # 执行去重 unique(con.hull.mod)
方法2:用dplyr的distinct()处理近似相等
如果使用tidyverse工具链,distinct()可以结合near()函数处理浮点数的近似匹配:
library(dplyr) con.hull.mod %>% distinct(across(everything()), .keep_all = TRUE)
方法3:用data.table的unique()设置容差
data.table包的unique()支持直接设置tol参数,定义浮点数视为相等的误差范围:
library(data.table) setDT(con.hull.mod) unique(con.hull.mod, by = c("x", "y"), tol = 1e-6)
验证误差的方法
可以通过以下代码查看两行的实际数值差异:
# 查看第2、3行x列的差值 con.hull.mod$x[2] - con.hull.mod$x[3] # 查看第2、3行y列的差值 con.hull.mod$y[2] - con.hull.mod$y[3]
会得到一个极小的非零值(比如1e-10级别),这就是unique()未识别为重复的核心原因。
内容的提问来源于stack exchange,提问作者Pratik Mullick
相关产品推荐
相关产品推荐

