r - 使用 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 的某种组合unique
,uniqueN
但似乎无法完全正确。
非常感谢任何帮助。
解决方案
我们可以做的
library(data.table)
tmp <- setDT(df)[df[, .I[uniqueN(ID2)== 1], ID1]$V1]
na.omit(unique(tmp[tmp[, .I[uniqueN(ID1) == 1], ID2]$V1]))
推荐阅读
- python - 特殊行中的 setRowHeight pandastable
- python - 防止 jupyter notebook 在打开时运行所有单元格
- google-compute-engine - TPU 训练在某些指标上失败,在 CPU 上成功
- c++ - 如果主机定义具有构造函数,则从 DLL 返回的结构读取垃圾
- javascript - module.exports 在依赖项(导入)上不可用
- python - sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) 即使在使用 db.create_all() 之后也没有这样的表
- linux - 如何使用点网?
- python - Python ReportLab - 自动 PageBreak 创建空白页
- java - key.properties 颤振 APK 构建
- django - Django:使用 Ajax 将上下文传递到模板中