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

