2017-12-12 6 views
1

I Rのdata.tableに次がありますので、R data.tableグループどこ

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

私がAを持っているIDでグループ化された行のみを表示したいではなく、Bを私を取得

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

これまでのところ、私はこれを持って

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

:結果はこのようなものになるだろう

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

私は正しい軌道にいると思いますが、私は自分が望む行をどうやって得るのか分かりません。私は正しい道を歩いているのですか、それとも間違った方法を考えていますか?この中

答えて

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でのIDを取得するには、最後の点についてAなくB

+0

を持っているIDが含まれます保証する、自己半がhttpsに参加する必要があるかもしれません:// stackoverflowのdt [dt [status == "A"、。(id)]、on = "id"] 'のようなデータテーブルを持つ.com/questions/18969420/perform-a-semi-joinテーブル。 – Frank

+0

@Frankは、 'B'値も持つ' A'IDを除外しませんか? – SymbolixAU

+0

はい、私は 'dt [...] [...]'チェーンの最初の部分を意味していました。だから 'DT = data.table(id = 1、status = LETTERS [c(1,3)])' 'では、最初の行だけでなく、' id'のすべての行を見たいので、 'DT on = "id"] [!(DT [status == "B"、unique(id)])、on = "id" ] = not "DT [status ==" A "] [!(DT [status ==" B "、unique(id)])、on =" id "]' – Frank