我在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
我认为这是正确的轨道,但我不知道如何获得我想要的行。我是在正确的轨道上,还是我完全以错误的方式思考它?
答案 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