我有一个名为9456
的{{1}}:
我的实际data.table
有62871932行和3列:
dtA
dtA
date company value
198101 A 1
198101 A 2
198101 B 5
198102 A 2
198102 B 5
198102 B 6
有一些我要从data.table
中删除的列,因此dtB
就像规则一样:
实际dtA
有19615280行和3列:
dtB
最终结果是:
dtB
它不像以下那么简单:
date company value
198101 A 2
198102 B 5
因为它还取决于日期和价值。
我尝试将两个表合并在一起,并将其链接而不是语句:
date company value
198101 A 1
198101 B 5
198102 A 2
198102 B 6
我收到此消息:
加入结果超过2 ^ 31行(内部vecseq达到物理 限制)。很可能是错误的加入。
有什么想法吗?
答案 0 :(得分:6)
使用反加入:
dtA[!dtB, on=.(date, company, value)]
这会使用dtA
中的列匹配dtB
中未在on
中找到的所有记录。
答案 1 :(得分:0)
我想我知道如何解决这个问题:
在dtB中我使用data.table语法添加指针:
dtB[, pointer := 1]
dtB看起来像这样
date company value pointer
198101 A 2 1
198102 B 5 1
然后我从这里使用LEFT OUTER JOIN方法: https://rstudio-pubs-static.s3.amazonaws.com/52230_5ae0d25125b544caab32f75f0360e775.html
setkey(dtA, date, company, value)
setkey(dtB, date, company, value)
dtA=merge(dtA, dtB, all.x)
这意味着在指针列上,如果dtB中存在dtB的行,它将给出1.如果dtB中的dtB行不存在,那么它将被赋予NA
结果将是:
date company value pointer
198101 A 1 NA
198101 A 2 1
198101 B 5 NA
198102 A 2 NA
198102 B 5 1
198102 B 6 NA
然后我选择那些带NA的行并删除指针列:
dtA=dtA[!(pointer %in% "1")][,-c("pointer")]
我得到了我的结果:
date company value
198101 A 1
198101 B 5
198102 A 2
198102 B 6