使用 R 在数据框中的 columns/fields 中查找顺序复制
Using R to find sequential replicates in columns/fields in data frame
有一个名为 dt
(如下)的数据 table,它有 5 列。数据的性质是 REG
始终 一致且唯一 但相同 REG
的 ID
可能不同( 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'分组,if
unique
元素的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),]
这是使用 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
有一个名为 dt
(如下)的数据 table,它有 5 列。数据的性质是 REG
始终 一致且唯一 但相同 REG
的 ID
可能不同( 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'分组,if
unique
元素的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),]
这是使用 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