根据另一个data.table删除data.table中的行

时间:2018-02-02 23:45:28

标签: r data.table

我有一个名为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达到物理   限制)。很可能是错误的加入。

有什么想法吗?

2 个答案:

答案 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