根据键消除所有重复项 + 保留 table 中不在另一个 table 中的记录

Eliminate all duplicates according to a key + keep records from a table which are not in another table

问题 1:

我对 R 比较陌生,有两个不同的问题。 我需要根据一个键(单个或多个)消除重复项,但所有这些都不会,所以 unique 不会这样做。我还找到了函数 duplicated 但它只会在第二次出现后标记为 true,但我需要消除所有这些。

> DT <- data.table(Key=c("a","a","a","b","c"),var=c(1:5))
> DT
   Key var
1:   a   1
2:   a   2
3:   a   3
4:   b   4
5:   c   5
> unique(DT)
   Key var
1:   a   1
2:   b   4
3:   c   5
> duplicated(DT)
[1] FALSE  TRUE  TRUE FALSE FALSE

我想要的是

   Key var
1:   b   4
2:   c   5

问题 2:

我有 2 个数据表,我只想保留来自 DTFrom 的记录,其中来自 2 个(或更多键)的值的组合不在 DTFilter 中(我发现了类似的问题对于 SQL 但不是 r):

   > DTFrom
    key1 key2 var
 1:    q    m   1
 2:    q    n   2
 3:    q    b   3
 4:    w    n   4
 5:    e    m   5
 6:    e    n   6
 7:    e    b   7
 8:    r    n   8
 9:    r    b   9
10:    t    m  10
11:    t    n  11
12:    t    b  12
13:    t    v  13
> DTFilter
   key1 key2 var
1:    q    m   1
2:    w    n   4
3:    e    b   7
4:    e    n   6
5:    r    n   8
6:    r    b   9
7:    t    m  10
8:    t    v  13

我希望结果是:

    > DTOut
   key1 key2 var
1:    q    n   2
2:    q    b   3
3:    e    m   5
4:    t    n  11
5:    t    b  12

提前致谢!

第一个问题,可以使用duplicated中的fromLast参数:

DT[ !(duplicated(Key) | duplicated(Key, fromLast = TRUE))]
#   Key var
#1:   b   4
#2:   c   5

对于第二个问题,你可以这样做:

setkey(DTFrom, key1, key2)
DTFrom[!DTFilter]
#   key1 key2 var
#1:    e    m   5
#2:    q    b   3
#3:    q    n   2
#4:    t    b  12
#5:    t    n  11

第一个问题可以使用table函数进行额外过滤:

DT[!duplicated(Key)][table(DT$Key) == 1,]
#    Key var
# 1:   b   4
# 2:   c   5

关于第二个问题,dplyr包中有anti_join函数专门针对这种情况:

require("dplyr")
anti_join(DTFrom, DTFilter, by = c("key1", "key2"))
#   key1 key2 var
# 1    e    m   5
# 2    q    b   3
# 3    q    n   2
# 4    t    n  11
# 5    t    b  12

我对第一个问题的首选方法是:

DT[.(DT[ , .N, by=key(DT)][N==1L, !"N"])]

同样我们可以这样做:

DT[.(DT[, .N, by=key(DT)][N==1L, ]), .SD]

@docendodiscimus 对 Q2 的回答也是我的。