有一个名为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
中的副本,但不知道如何区分REG
中ID
不同的副本?
答案 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)
以下是使用table
,colSums
和子集的第二个基本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