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