我有以下数据:
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_by
和filter
一起出现的行:
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