Универсальным решением для удаления одного или нескольких столбцов "по" может быть использование mget
+ цепочки:
dt = data.table(a=c(10,20,30,40),b=c(40,30,20,10),c=c(0,0,1,1),d=c(0,0,0,1))
dt
# a b c d
# 1: 10 40 0 0
# 2: 20 30 0 0
# 3: 30 20 1 0
# 4: 40 10 1 1
by.cols = c("c", "d")
# group by one or multiple columns without returning the "group by" columns
# (includes code of @Frank now, see comment)
dt[, .(rank=rank(a)),by = by.cols] [, -(1:length(by.cols))]
# rank
# 1: 1
# 2: 2
# 3: 1
# 4: 1
#
# OLD code (before including the code snippets from @Frank)
# dt[, .(rank = rank(a)),by=mget(by.cols)] [, -(1:length(by.cols))]
Не красиво, но работает.
PS: есть ли лучший способ исключить столбцы из data.table
, чьи имена хранятся в символьном векторе?