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

如何使用dplyr的distinct函数基于两列保留全部唯一行?

基于两列唯一值去重并保留指定行的解决办法

你想用dplyr的distinct()函数,根据lang和usage两列的唯一组合对数据集去重,结果却发现原数据里两行GO记录被误删——但这两行的usage明明不一样,你想把它们都留下来。

示例数据与原代码

library(dplyr) 

df <- data.frame (lang =c ('Java','C','Python','GO','RUST','Javascript', 
                           'Cpp','Java','Julia','Typescript','Python','GO'), 
                  
                  value = c (21,21,3,5,180,9,12,21,6,0,3,6), 
                  
                  usage =c(21,21,0,99,44,48,53,21,6,8,0,6)) 


df.1col <- distinct(df, lang, .keep_all= TRUE)

# 此处错误指定了去重列:你需要的是lang+usage,实际写了value+usage
df.2col <- distinct(df, value, usage, .keep_all= TRUE) 

问题原因

你核心的问题是指定的去重列不符合需求:你想按lang和usage的组合去重,但代码里写的是value和usage。另外要明确:distinct()只会删除指定列组合完全重复的行,只要列组合不同,哪怕同一语言的记录也会被保留。

原数据里两行GO的lang+usage组合是(GO,99)和(GO,6),属于完全不同的唯一组合,只要指定对列,这两行都会被保留。

正确解决方案

直接在distinct()中明确指定lang和usage作为去重列即可:

# 按lang和usage的组合去重,保留所有唯一行
df.2col_fixed <- distinct(df, lang, usage, .keep_all = TRUE)

验证结果

运行后打印处理后的数据集,能看到两行GO都被保留:

lang value usage
4    GO     5    99
12   GO     6     6

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 09:57:48