首页 > 解决方案 > 使用 data.table 过滤以仅保留一对一匹配

问题描述

我正在处理一个包含两个 ID 列的大表。例如

ID1    ID2
01A    XY1
01B    XY4
...

两个 ID 列中都有重复值,并且已决定仅保留两个 ID 之间存在一对一匹配的情况。即,如果任何 ID1 值与多个 ID2 值匹配,则删除具有该 ID1 值的所有行。反之亦然。

我已经编写了一些使用dplyr该作品的代码:

df %>%
  group_by(ID1) %>%
  filter(n_distinct(ID2)==1) %>%
  distinct() %>%
  filter(!is.na(ID2)) %>%
  group_by(ID2) %>%
  filter(n_distinct(ID1)==1) %>%
  distinct() %>%
  filter(!is.na(ID1))

但是,由于表的大小,这运行起来很慢。我试图弄清楚如何使用data.table. 我认为它必须使用 and 的某种组合uniqueuniqueN但似乎无法完全正确。

非常感谢任何帮助。

标签: rdata.tablematchingdata-wrangling

解决方案


我们可以做的

library(data.table)
tmp <- setDT(df)[df[, .I[uniqueN(ID2)== 1], ID1]$V1]
na.omit(unique(tmp[tmp[, .I[uniqueN(ID1) == 1], ID2]$V1]))

推荐阅读