如何在R语言中基于多列数据使用duplicated识别重复值?
基于多列数据识别重复值的解决方法
嘿,我明白你遇到的问题了——用duplicated处理单变量没问题,但多变量组合就卡壳了对吧?其实这个函数本身就支持多列组合的判断,不用自己用&去拼接,我给你一步步讲清楚:
核心方法:直接传入多列子集给duplicated
duplicated函数可以接收数据框的子集(也就是你要判断重复的多列)作为参数,而不是只能传单个向量。这样就能直接基于多列的组合来识别重复行。
步骤1:先优化你的示例数据类型
首先注意你的示例数据里,ID、Date、Sale都是字符型,建议先把Date转成日期类型,Sale转成数值型,这样判断重复更准确:
# 创建数据框时避免自动转因子,同时转换类型 DF1 <- data.frame(ID = c('1','1','3','4','3'), Date = as.Date(c('01-04-2016','01-05-2016','01-04-2016','01-06-2016', '01-04-2016'), format = "%d-%m-%Y"), Sale = as.numeric(c('1000','1000','1000','2000', '1000')), stringsAsFactors = FALSE)
步骤2:基于多列标记重复值(仅标记后续重复行)
如果你只想标记除第一次出现外的重复行,直接传入你要判断的列名组合即可:
# 基于ID、Date、Sale三列判断重复 DF1$dupes <- duplicated(DF1[c("ID", "Date", "Sale")]) # 查看结果 print(DF1)
运行后你会看到第5行的dupes是TRUE,因为它和第3行的三列数据完全一致,属于后续出现的重复行。
步骤3:标记所有重复行(包括首次出现的)
如果需要把第一次出现的重复行也标记出来(比如第3行和第5行都标记为重复),可以结合fromLast = TRUE的参数,用逻辑或连接两个方向的判断结果:
# 标记所有重复的行(首次出现的也会被标记) DF1$all_dupes <- duplicated(DF1[c("ID", "Date", "Sale")]) | duplicated(DF1[c("ID", "Date", "Sale")], fromLast = TRUE)
为什么之前用&会有问题?
你之前尝试DF1$dupes &...的思路是把单列的重复结果做逻辑与,但这其实不对——单列重复不代表多列组合重复,比如你的数据里ID=1出现了两次,但Date不同,所以不是重复行,而用单列重复的逻辑与会误判。直接传入多列子集给duplicated才是正确的方式,它会逐行比较多列的组合是否完全一致。
内容的提问来源于stack exchange,提问作者Adam_S
相关产品推荐
相关产品推荐

