检查数据框的一组重复行中的冲突

时间:2019-12-02 09:41:41

标签: r dataframe

我有一个数据框df,如下所示,它由某些列(id和序列)中的重复项组成:

df <- data.frame(id = c('B19','B19','B19','B20','B20','B20'), 
                 serial = c('a','a','a','b','b','b'), 
                 code = c('IA284','IA114','IA114','IB290','IB485','IB290'))

df

#  id  serial  code
#  B19    a    IA284
#  B19    a    IA114
#  B19    a    IA114
#  B20    b    IB290
#  B20    b    IB485
#  B20    b    IB290

我可以使用以下代码识别重复的ID和序列号:

df$comment[duplicated(df[,1:2])] <- "DUPLICATED"

但是我想计算哪些行重复了(重复的)id和序列对,对于发现的每组重复项,我都需要对其进行比较。在单独的一栏中,我想打印发现的重复项集和代码中的差异(如果有)。

示例结果df:

#  id  serial  code    Duplicate_Set    comment
#  B19    a    IA284       1               1
#  B19    a    IA114       1               2
#  B19    a    IA114       1               2
#  B20    b    IB290       2               2
#  B20    b    IB485       2               1
#  B20    b    IB290       2               2

说明:在“ Duplicate_Set”中,我想对重复的“ id”和“ serial”对进行分组,并为其分配一个数字。在“注释”列中,我希望比较每个重复集的代码值,并打印每个集合的重复代码数。这只是df的一个示例。如果有人可以帮助我打印“唯一”和“重复”而不是“评论”列中的1和2,那么也很好。

2 个答案:

答案 0 :(得分:1)

使用dplyr,我们首先可以为每对idSerial创建一个唯一的编号,然后分别为group_by和{{1} }计算组中的行数。

Duplicate_Set

@tmfmnk建议的较短版本

code

答案 1 :(得分:0)

我们也可以使用data.table

library(data.table)
setDT(df)[, Duplicate_Set := rleid(id, serial)][, 
      comment := .N, .(Duplicate_Set, code)][]
#    id serial  code Duplicate_Set comment
#1: B19      a IA284             1       1
#2: B19      a IA114             1       2
#3: B19      a IA114             1       2
#4: B20      b IB290             2       2
#5: B20      b IB485             2       1
#6: B20      b IB290             2       2