【问题标题】:Remove rows in data.table according to another data.table根据另一个data.table删除data.table中的行
【发布时间】:2018-02-02 23:45:28
【问题描述】:

我有一个名为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.tabledtB 有一些列我想从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)]

我收到这条消息:

Join 结果超过 2^31 行(内部 vecseq 达到物理 限制)。很可能是指定错误的连接。

有什么想法吗?

【问题讨论】:

  • 您预期的数据看起来不正确。 198101 B 5 应该已被删除。
  • 不,dtB 没有 198101 B 5 但 198102 B 5 所以预期结果是正确的..

标签: r data.table


【解决方案1】:

使用反连接:

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

这将使用on 中的列匹配dtA 中未在dtB 中找到的所有记录。

【讨论】:

  • 感谢它的工作!又好又干净!我的方法更快,但编码更笨拙
  • 您好,感谢您的回答。您能否向我确认,这里使用 on=... 仅在两个表的列名相互匹配时才有效。如果不需要,则需要在两个表上设置键,因此不需要调用on 参数?
【解决方案2】:

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

在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2021-06-01
    相关资源
    最近更新 更多