首页 > 解决方案 > 检查数据框的一组重复行中的冲突

问题描述

我有一个数据框,df,如下所示,其中包含某些列(id 和 serial)中的重复项:

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 和 serial 并且对于找到的每组重复项,然后我需要比较它的代码。在单独的列中,我想打印找到的一组重复项以及代码中的差异(如果有)。

示例结果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,那么它也会很棒。

标签: rdataframe

解决方案


使用dplyr,我们可以首先为每对id和创建一个唯一的数字Serial,然后group_by每个Duplicate_Setcode计算组中的行数。

library(dplyr)
df %>%
  mutate(Duplicate_Set = group_indices(., id, serial)) %>%
  group_by(Duplicate_Set, code) %>%
  mutate(comment = n())

#  id    serial code  Duplicate_Set comment
#  <fct> <fct>  <fct>         <int>   <int>
#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

@tmfmnk 建议的较短版本

df %>% 
  group_by(Duplicate_Set = group_indices(., id, serial)) %>% 
  add_count(code, name = "comment")

推荐阅读