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

6

我有一个名为dtAdata.table:

我的实际dtA有62871932行和3列:

  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中删除,所以dtB就像规则一样:

实际的dtB有19615280行和3列:

  date    company    value
198101          A        2
198102          B        5

最终结果是:
  date    company    value
198101          A        1
198101          B        5
198102          A        2
198102          B        6

这并不像看起来那么简单:

dtA=dtA[!(dtB$company %in% dtA$company)] 

这也取决于日期和数值。

我尝试将两个表合并并使用not in语句连接它们:

dtA=dtA[dtB, on=date][!(company %in% comapny) & !(value %in% value)]

我收到了这个信息:

连接结果超过了2^31行(内部vecseq达到了物理极限)。很可能是联接错误。

有什么想法吗?

您期望的数据看起来不正确。198101 B 5 应该被删除。 - MKR
不,dtB没有198101 B 5,而是有198102 B 5,所以预期结果是正确的。 - Gabriel
2个回答

13

使用反连接:

dtA[!dtB, on=.(date, company, value)]

使用on中的列,这将匹配在dtA中与dtB不匹配的所有记录。


1
谢谢,它可以工作!漂亮简洁!我的方法更快,但编码更笨重。 - Gabriel
嗨,感谢您的回答。您能否确认对我来说,在这里使用 on=... 仅在两个表的列名匹配时才起作用。如果不是这种情况,它需要在两个表上设置键,并且因此不需要调用 on 参数? - Paul Endymion

1

我认为我知道如何解决这个问题:

在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的行存在于dtA中,则会给出1。如果dtB的行不存在于dtA中,则会给出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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接