根据键消除所有重复项 + 保留 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 的回答也是我的。
问题 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 的回答也是我的。