r语言 - 查找在两个数据集中只出现一次的行



我有以下数据:

library(data.table)
datA <- fread("A B C
1 1 1
2 2 2")
datB <- fread("A B C
1 1 1
2 2 2
3 3 3")

我想弄清楚哪些行是唯一的(哪一行是3 3 3,因为所有其他行都出现得更频繁)。

我试着:

dat <- rbind(datA, datB)
unique(dat)
!duplicated(dat)

我也试过

setDT(dat)[,if(.N ==1) .SD,]

但那是NULL

我该怎么做?

您可以使用fsetdiff:

rbind.data.frame(fsetdiff(datA, datB, all = TRUE),
fsetdiff(datB, datA, all = TRUE))

一般来说,这称为anti_join:

library(dplyr)
bind_rows(anti_join(datA, datB),
anti_join(datB, datA))
A B C
1: 4 4 4
2: 3 3 3

数据:我在datA中添加了一行,以显示如何从两个数据集保持行(简单的反连接不起作用):

library(data.table)
datA <- fread("A B C
1 1 1
2 2 2
4 4 4")
datB <- fread("A B C
1 1 1
2 2 2
3 3 3")

一个可能的解决方案

library(data.table)
datB[!datA, on=c("A", "B", "C")]
A     B     C
<int> <int> <int>
1:     3     3     3

或者(如果你对对称差感兴趣)

funion(fsetdiff(datB, datA), fsetdiff(datA, datB))
A     B     C
<int> <int> <int>
1:     3     3     3

另一个dplyr选项,通过过滤与group_byfilter一起出现的行:

library(data.table)
library(dplyr)
datA %>%
bind_rows(., datB) %>%
group_by(across(everything())) %>%
filter(n() == 1)
#> # A tibble: 1 × 3
#> # Groups:   A, B, C [1]
#>       A     B     C
#>   <int> <int> <int>
#> 1     3     3     3

创建于2022-11-09与reprex v2.0.2

最新更新