【问题标题】:R data.table group by whereR data.table 按哪里分组
【发布时间】:2017-12-12 04:17:16
【问题描述】:

我在 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

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

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    在这个(我假设是简化的)示例中,您可以过滤具有 B 的行,然后 anti-join 将它们返回到原始数据中

    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

    【讨论】:

    • 最后一点,要获得带有 A 的 id,可能需要一个自半联接 stackoverflow.com/questions/18969420/…dt[dt[status=="A", .(id)], on="id"] 或其他东西。
    • @Frank 不会排除那些 A 也有 B 值的 id?
    • 是的,我的意思是dt[...][...] 链的第一部分。所以对于DT = data.table(id = 1, status = LETTERS[c(1,3)]),我想查看id 的所有行,而不仅仅是第一行,所以DT[.(DT[status == "A", unique(id)]), on="id"][!.(DT[status == "B", unique(id)]), on="id"] 不是DT[status == "A"][!.(DT[status == "B", unique(id)]), on="id"]
    猜你喜欢
    • 1970-01-01
    • 2022-11-15
    • 2013-08-09
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 2020-09-01
    相关资源
    最近更新 更多