R data.table group by where

时间:2017-12-12 04:17:17

标签: r data.table

我在R data.table中有以下内容:

  id | status
=============
   1 |      A
   1 |      B
   2 |      A
   2 |      B
   3 |      A
   4 |      A
   5 |      B

我想只显示按ID分组的行,这些行包含A,但不是B.所以结果会是这样的:

  id | status
=============
   3 |      A
   4 |      A

到目前为止,我有这个:

dt[, sum(status == "A") > 0 && sum(status == "B") == 0, by = id]

让我:

  id | status
=============
   1 |  FALSE
   2 |  FALSE
   3 |   TRUE
   4 |   TRUE
   5 |  FALSE

我认为这是正确的轨道,但我不知道如何获得我想要的行。我是在正确的轨道上,还是我完全以错误的方式思考它?

1 个答案:

答案 0 :(得分:3)

在此(我假设已简化)示例中,您可以过滤具有B,然后反连接的行返回原始数据的行

dt[ !dt[ status == "B" ], on = "id" ]

#    id status
# 1:  3      A
# 2:  4      A

这是因为

dt[ status == "B"]

给出B的ID。这些是您要从结果集中排除的,可以通过反连接(dt[ !dt[ ] on = "" ]表示法)来实现

如果您的数据更复杂,您可以在此逻辑中添加一些额外的过滤器,以便首先过滤您想要的值,例如。

dt[status == "A"][ !dt[ status == "B" ], on = "id" ]

将确保您返回的结果中包含A而不是B

的ID