如果我有两个data.tables,dt1
和dt2
,我希望列之间的匹配数使用if then逻辑。如果是dt1$V1==dt$V2
,那么会dt$V1 == dt$V2
吗?但是这个if-then语句的关键是按dt1$V1 == dt$V2
中的匹配进行分组。我想使用data.table来提高效率,因为我实际上有一个大型数据集。
dt1 <- data.table(c("a","b","c","d","e"), c(1:5))
dt2 <- data.table(c("a","d","e","f","g"), c(3:7))
在这个虚拟示例中,V1之间有3个匹配,但V2中只有两个匹配。所以答案(使用nrow
或许,如果我是子集),将是2。
答案 0 :(得分:6)
我想你正在寻找fintersect
:
fintersect(dt1,dt2)
给出:
V1 V2 1: d 4 2: e 5
要获取行数,请添加[, .N]
:
fintersect(dt1,dt2)[, .N]
给出:
[1] 2
答案 1 :(得分:1)
嗯,这不是很好,但是,它有效:
sum(dt1[V1 %in% dt2$V1]$V2 == dt2[V1 %in% dt1[V1 %in% dt2$V1]$V1]$V2)
只需阅读您的评论,如果您想要一个具有正确组合的data.table,您可以使其更长,如下所示:
dt1[V1 %in% dt2$V1][dt1[V1 %in% dt2$V1]$V2 == dt2[V1 %in% dt1[V1 %in% dt2$V1]$V1]$V2]
V1 V2
1: d 4
2: e 5
我非常期待看到其他答案:)
答案 2 :(得分:1)
我们可以做一个join
dt1[dt2, on = names(dt1), nomatch = 0]
# V1 V2
#1: d 4
#2: e 5
来自inner_join
的或dplyr
library(dplyr)
inner_join(dt1, dt2)
# V1 V2
#1 d 4
#2 e 5
或merge
merge(dt1, dt2)
# V1 V2
#1: d 4
#2: e 5
对于上述所有情况,可以通过nrow
nrow(merge(dt1, dt2))