How can I drop/keep groups according to a condition in data.table? Is there a better method than adding a new column, then filtering on that column and removing it?
You can use an if condition with .SD after grouping dt by column a:
dt[, if(2 %in% b) .SD, a]
# a b
#1: 1 5
#2: 1 2
#3: 1 2
#4: 2 3
#5: 2 5
#6: 2 2
From ?.SD, .SD is a data.table containing the Subset of x's Data for each group. Combined with if condition, we return nothing if 2 is not in column b and drop the corresponding group.
I am sure that it is not the best solution, but that works.
dt[a%in% dt[, a[2%in%b], by=a][, a],]
Here is another method that uses .I to return the row indices of selected groups and then subsets on the row:
dt[dt[, .I[2 %in% b], a]$V1]
a b
1: 1 5
2: 1 2
3: 1 2
4: 2 3
5: 2 5
6: 2 2