Я вышел с другим data.table
ответом:
library(data.table) # load package
# set to data.table
setDT(df)
setDT(bktpts)
# Make a join
df[bktpts[, list(.(value)), by = groupid], bks := V1, on = "groupid"]
# define the bins:
df[, bin := cut(value, bks[[1]], include.lowest = TRUE, labels = FALSE), by = groupid]
# remove the unneeded bks column
df[, bks := NULL]
Объясняя код:
bktpts[, list(.(value)), by = groupid]
- это новая таблица с в списке со значениями value
для каждого groupid
. Если вы запустите его в одиночку, вы поймете, куда мы идем.
bks := V1
присваивает переменной bks
в df
все, что существует в V1
, что является именем столбца списка в предыдущей таблице. Конечно, on = "groupid"
- это переменная, по которой мы производим соединение.
Код, определяющий ячейки, не требует особых пояснений, кроме бита bks[[1]]
. Это должно быть [[
, чтобы получить доступ к значениям списка и предоставить вектор, как требуется функцией cut
.
ИЗМЕНИТЬ В ДОБАВИТЬ:
Все команды data.table могут быть объединены в один неразборчивый вызов:
df[bktpts[, list(.(value)), by = groupid],
bks := V1,
on = "groupid"][,
bin := cut(value,
bks[[1]],
include.lowest = TRUE,
labels = FALSE),
by = groupid][,
bks := NULL]