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

如何使用R语言{collapse}包实现dplyr::distinct()或base::unique.data.frame()的功能?

在{collapse}包中实现多列唯一组合的方法

嘿,我懂你现在的困惑——刚接触{collapse}包,想找替代dplyr::distinct()或base::unique.data.frame()的方法来获取数据框多列的唯一组合,结果用collap()得到的行数和预期不一致对吧?其实问题出在collap()的定位上,它主要是用来做聚合运算的(比如按分组计算均值、求和这类操作),不是用来去重的,所以你之前的用法才会出错。

下面给你介绍{collapse}包里专门用来做去重、获取唯一组合的两个函数,完美匹配你的需求:

1. 使用fdistinct()(对应dplyr::distinct())

fdistinct()就是{collapse}为替代dplyr::distinct()设计的函数,用法几乎一致,非常容易上手:

library(babynames)
library(dplyr, warn.conflicts = FALSE)
library(collapse, warn.conflicts = FALSE)

# 用fdistinct获取sex和name的唯一组合
via_collapse <- babynames %>% fdistinct(sex, name)

# 验证行数
nrow(via_collapse)
#> [1] 107973

和你用distinct()得到的结果完全一致!如果需要保留其他列的话,只需要加上.keep_all = TRUE参数,就像dplyr::distinct()那样。

2. 使用funique()(对应base::unique.data.frame())

如果你更习惯base R的unique()逻辑,{collapse}里的funique()就是对应的高效版本,有两种用法:

# 方式1:直接指定要去重的列名
via_collapse2 <- babynames %>% funique(c("sex", "name"))

# 方式2:先选择目标列,再去重
via_collapse3 <- babynames %>% select(sex, name) %>% funique()

# 验证行数,结果同样是107973
nrow(via_collapse2)
nrow(via_collapse3)

这两个函数的优势在于{collapse}包本身的性能优化,处理大数据框时,速度会比dplyr::distinct()或base::unique()快很多,非常适合大规模数据的去重操作。

内容的提问来源于stack exchange,提问作者Emman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 05:09:05