如何使用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
相关产品推荐
相关产品推荐

