R语言:duplicated()的fromLast参数能否作用于integer64向量?
解决integer64向量保留最新唯一值的问题
确实,bit64包提供的integer64类型对应的duplicated.integer64()方法并没有实现fromLast参数,这确实会给按时间排序数据、保留最新重复值的需求带来麻烦。你目前用的rev(duplicated(rev(x)))思路完全可行,下面我来拆解这个方法的逻辑,同时提供更直观的替代方案:
你的现有方法详解
这个方法的核心是通过两次反转,把“保留最后出现的唯一值”转化为普通duplicated()能处理的“保留第一次出现的唯一值”:
- 先把向量
x反转,此时原向量中最后出现的重复值变成了反转后向量的第一个出现项 - 用
duplicated()标记反转后向量中的重复项(默认标记除第一次出现外的所有重复) - 再把标记结果反转回来,就得到了原向量中除最后一次出现外的所有重复项的标记
具体代码示例:
library(bit64) # 构造按时间从早到晚排序的integer64测试向量 x <- as.integer64(c(1001, 1002, 1002, 1003, 1001, 1004)) # 生成重复项标记(除最后一次出现的项外,其余重复项标记为TRUE) dup_flags <- rev(duplicated(rev(x))) # 筛选保留最新的唯一值 latest_unique <- x[!dup_flags] print(latest_unique) # 输出:1002 1003 1001 1004(对应原向量的第3、4、5、6位,即每个值的最后一次出现)
更直观的替代方案:用data.table处理
如果你觉得两次反转的写法不够直观,可以用data.table包的unique()函数,它对integer64类型支持良好,并且原生支持fromLast=TRUE参数,直接指定保留最后出现的唯一值:
library(data.table) library(bit64) x <- as.integer64(c(1001, 1002, 1002, 1003, 1001, 1004)) # 直接处理向量,或者放到data.table中处理 latest_unique_dt <- unique(data.table(id = x), by = "id", fromLast = TRUE)$id print(latest_unique_dt)
这个方法代码更易读,而且在处理大规模数据时,data.table的内部优化会比两次反转的效率更高。
关于方法的注意点
- 你的反转方法逻辑完全正确,对于中小规模数据来说性能足够,没有隐藏的坑
- 如果是处理超大规模的
integer64向量,优先推荐data.table方案,避免两次反转带来的内存开销
内容的提问来源于stack exchange,提问作者kshirley
相关产品推荐
相关产品推荐

