使用 R 在数据框中的 columns/fields 中查找顺序复制

Using R to find sequential replicates in columns/fields in data frame

有一个名为 dt(如下)的数据 table,它有 5 列。数据的性质是 REG 始终 一致且唯一 但相同 REGID 可能不同( i.g. REG 8888)。

dt:
        ID    Var1  Var2 REG    Var3
    1   000AA   bs  km  8888    wz
    2   000kk   sd  zx  5555    ec
    3   111XX   ty  cn  2222    re
    4   000PP   dg  ed  6666    df
    5   000AA   sd  qq  8888    gh
    6   000DD   df  we  9999    cb
    7   000AA   ht  iy  8888    nb
    8   800BB   as  et  8888    mo
    9   111XX   ty  rt  2222    qe
    10  000AA   gd  uu  8888    xc

意向:
REG 中找到具有不同 ID 的一行(包含所有列的完整信息)的重复。例如,在 REG 中有两个重复:8888 和 2222 但 8888 是一个很重要,因为只有 REG 8888 有两个不同的 ID:000AA 和 800BB。

预期结果:

ID  Var#1   Var#2   REG Var#3
000AA   bs  km  8888    wz
000AA   sd  qq  8888    gh
000AA   ht  iy  8888    nb
800BB   as  et  8888    mo
000AA   gd  uu  8888    xc

我知道如何识别 REG 中的重复项,但不知道如何区分 R 中具有不同 ID 的重复项?

我们可以使用data.table。将'data.frame'转换为'data.table'(setDT(dt)),按'REG'分组,ifunique元素的length更大比 1,然后子集 Data.table (.SD)。

library(data.table)
setDT(dt)[, if(uniqueN(ID)>1) .SD , REG][, names(dt), with = FALSE]
#      ID Var1 Var2  REG Var3
#1: 000AA   bs   km 8888   wz
#2: 000AA   sd   qq 8888   gh
#3: 000AA   ht   iy 8888   nb
#4: 800BB   as   et 8888   mo
#5: 000AA   gd   uu 8888   xc

dplyr 中的一个类似选项是

library(dplyr)
dt %>%
   group_by(REG) %>%
   filter(n_distinct(ID)>1)
#     ID  Var1  Var2   REG  Var3
#   <chr> <chr> <chr> <int> <chr>
#1 000AA    bs    km  8888    wz
#2 000AA    sd    qq  8888    gh
#3 000AA    ht    iy  8888    nb
#4 800BB    as    et  8888    mo
#5 000AA    gd    uu  8888    xc

或带有 ave

base R 选项
dt[with(dt, ave(ID, REG, FUN =function(x) length(unique(x)))>1),]

这是使用 tablecolSums 和子集化的第二个基本 R 替代方案。

# get the count of unique IDs for each REG
IDCount <- colSums(with(df, table(ID, REG)) > 0)

# subset to include only REGs with more than one ID
df[df$REG %in% names(IDCount)[IDCount > 1],]
      ID Var1 Var2  REG Var3
1  000AA   bs   km 8888   wz
5  000AA   sd   qq 8888   gh
7  000AA   ht   iy 8888   nb
8  800BB   as   et 8888   mo
10 000AA   gd   uu 8888   xc