使用R在数据框中的列/字段中查找顺序复制

时间:2017-01-24 17:04:03

标签: r database text-processing data-cleaning

有一个名为dt(下面)的数据表有5列。数据的性质使REG始终一致且唯一但同一ID的{​​{1}}可能不同( ig REG 8888)。

REG

意图:
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中有两个重复项:8888& 2222但是8888是重要的,因为只有REG 8888有两个不同的REG:000AA& 800BB。

预期结果:

ID

我知道如何识别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 中的副本,但不知道如何区分REGID不同的副本?

2 个答案:

答案 0 :(得分:3)

我们可以使用data.table。将'data.frame'转换为'data.table'(setDT(dt)),按'REG'分组,if length元素的unique大于1 ,然后Subset the 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

base R

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

答案 1 :(得分: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